Gegevens oproepen uit twee tabellen
Mijn vraag gaat over het volgende. Ik heb een soortpagina waarin de soortcode in de url staat.
Bijv. http://www.website.nl/soortpagina.php?code=1002 (niet bestaande website!)
Alle info uit de db wordt opgehaald door de GET functie.
Vanuit de soortcode roept hij uit tabel "verwantesoort" de soorten op die er op lijken.
Dus op de soortpagina van 1002 (koolmees) toont hij een foto van 1092.jpg (pimpelmees).
Echter wil ik bij deze echo ook de soortnaam onder de foto vermelden, die uit de "naamlijst" wordt opgehaald. Door simpelweg te kijken: welke soortnaam hoort er bij 1092? Aha: 1092.jpg + Pimpelmees.
Hoe doe ik dat?
Alvast mijn hartelijke dank!
db_verwantesoort
------------------------------------------------------------------
id code naam verwantesoort1 verwantesoort2
----- ----- ----- ------------- --------------
1 1002 Koolmees 1092 1144
2 1005 Vink
3 1090 Specht
4 1092 Pimpelmees 1002
db_naamlijst
-------------------------
id code naam
----- ----- -----
1 1002 Koolmees
2 1005 Vink
3 1090 Specht
4 1092 Pimpelmees
Gewijzigd op 21/10/2018 19:41:22 door Ty Muus
Ik heb nu wat gestoeid om zo'n query op te stellen voor elke eventuele verwante soort.
Echter, ik krijg de melding: Column 'code' in where clause is ambiguous
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$code = $_GET['code'];
$query1 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort1 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var1 = mysqli_fetch_object($query1);
$query2 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort2 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var2 = mysqli_fetch_object($query2);
$query3 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort3 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var3 = mysqli_fetch_object($query3);
$query4 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort4 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var4 = mysqli_fetch_object($query4);
$query5 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort5 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var5 = mysqli_fetch_object($query5);
$query6 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort6 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var6 = mysqli_fetch_object($query6);
?>
$code = $_GET['code'];
$query1 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort1 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var1 = mysqli_fetch_object($query1);
$query2 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort2 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var2 = mysqli_fetch_object($query2);
$query3 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort3 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var3 = mysqli_fetch_object($query3);
$query4 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort4 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var4 = mysqli_fetch_object($query4);
$query5 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort5 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var5 = mysqli_fetch_object($query5);
$query6 = mysqli_query("SELECT * FROM db_gelijkend JOIN db_naamlijst ON db_gelijkend.soort6 = db_naamlijst.code WHERE code = '$code'") or die (mysqli_error());
$var6 = mysqli_fetch_object($query6);
?>
Wat doe ik fout? Vast veel..
Gewijzigd op 21/10/2018 20:37:56 door Ty Muus
Ook zijn meerdere queries zwaar overkill. Als je velden gaat nummeren, dan moet je zeker eens naar databasenormalisatie kijken. Je moet je database in de lengte kunnen uitbreiden, en niet 'in de breedtte.'
Gewijzigd op 21/10/2018 22:16:51 door - Ariën -
Ik heb me ingelezen op het artikel die je meestuurde en heb een regel die nog niet doet wat hij moet doen.
Maar hoe specifieker ik ook ben, hij levert nog niet het bevredigende resultaat op.
Zie jij waar het hem in zit?
Databasenormalisatie ga ik in de toekomst mee bezig, het is best een heel erg grote database die nog altijd werkt, dus dat doe ik als stap 2.
Code (php)
1
2
2
$code = $_GET['code'];
$query = "SELECT a.code,a.verwantesoort1,b.code,b.naam FROM db_verwantesoort a INNER JOIN db_naamlijst b USING ($code) WHERE a.code=b.code";
$query = "SELECT a.code,a.verwantesoort1,b.code,b.naam FROM db_verwantesoort a INNER JOIN db_naamlijst b USING ($code) WHERE a.code=b.code";
Gewijzigd op 27/10/2018 13:12:16 door Ty Muus
Wat voor resultaat komt er nu dan uit? En wat verwacht je?
PS: Ik zie SQL-injection in je GET.
Gewijzigd op 27/10/2018 13:22:39 door - Ariën -
Maar:
De echo geeft geen resultaat. Ik heb bijv. 3 echo's als test in het vervolg gezet, bijv. "". $var->verwantesoort1 ."", ze geven allen een leeg veld.
Ik verwacht hier dat soort met de code X toch nu wel uit op z'n minst beide tabellen de output geeft.
Gewijzigd op 27/10/2018 13:44:26 door Ty Muus
Hier nog een kolom bijmetselen is niet de oplossing want zoals je in bovenstaande code al ziet levert dit ook draken van queries op - je hebt het jezelf effectief onmogelijk gemaakt om op een makkelijke manier de data weer uit je database te trekken. Dat is niet het idee noch de bedoeling van databases.
Over het laatste fragment:
Quote:
Column 'code' in where clause is ambiguous
Hier staat precies wat er aan scheelt: de "code" kolom in het "where" gedeelte is dubbelzinnig omdat je niet aangeeft tot welke tabel (db_gelijkend of db_naamlijst) deze zou moeten behoren. Beide tabellen hebben een kolom genaamd "code" en als het systeem zou moeten raden welke dit zou moeten zijn pakt 'ie waarschijnlijk de verkeerde :).
Mijn advies zou zijn: zet een nieuwe database op en probeer de data geautomatiseerd te overhevelen. Als je het op die manier doet maakt het in principe niet uit uit hoeveel records je tabellen bestaan omdat het allemaal op dezelfde manier werkt en dus ook op dezelfde manier kan worden overgezet.
Daarbij doe je er verstandig aan om echt een relationele database op te zetten waarbij de verbanden ook echt hard worden vastgelegd, anders hangen alle tabellen nog steeds als los zand aan elkaar waarbij, zoals dat dan deftig heet, "de onderlinge kloppendheid van de data" (referentiële integriteit) niet kan worden gewaarborgd.
De datasets maak ik in CSV en importeer ze door ze om te zetten naar SQL. Kan het dan nog wel werken zoals jij beschrijft? Door ze te exporteren en weer te importeren krijg ik veelal afgebroken teksten etc. Ik heb dus slechte ervaringen met 'grote' tabellen. Het is de enige manier van hoe ik...denk ik...kan werken. Juist ook omdat complete data vanuit een grote landelijke database in één tabel moet worden ingevoegd.
Ik heb nu heel wat klusjes te doen merk ik; wat maakt dat ik na inlezen en uitproberen over 10 jaar klaar ben met de website. Haha. Het is niet dat ik het niet wil, maar niet weet hoe het werkt.
Ik heb nu letterlijk alle tabellen met elkaar verbonden door de unieke soortcode. Elke tabel heeft deze. Ook soortfoto's dragen code_1.jpg etc.
Het enige wat hij hoeft te doen, is de code van de verwante soort ophalen uit de naamlijst. Hij toont natuurlijk nu wel gewoon de foto's van de verwante soorten, bijv. 1012_1.jpg, maar ik wil de naam er onder hebben staan.
Door A en B mee te geven dacht ik het juist specifiek te hebben gemaakt. Dus ik zie het niet...
Een voorbeeldscript die wel gewoon werkt is SELECT * FROM db_naamlijst WHERE code LIKE '$code'". Dan zou hij dit toch ook moeten kunnen 'ophalen' zou je denken?
Gewijzigd op 28/10/2018 14:59:51 door Ty Muus