Join query
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$voertuigdetails = "SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
(WHERE hexon_nr = '$_GET[voertuig_nr]')"
;
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
(WHERE hexon_nr = '$_GET[voertuig_nr]')"
;
En wat gaat er fout? Wat voor melding krijg je?
Gewijzigd op 30/12/2013 13:48:14 door Ger van Steenderen
Gewijzigd op 30/12/2013 13:52:18 door Erwin H
Ahh als ik het goed begrijp kan ik dus niet snel alle data uit de beoogde join tabellen halen op deze manier?
Omdat dit wel werkt:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$sql = "SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
ORDER BY merk ASC LIMIT $start_from, 5";
$rs_result = mysqli_query ($con,$sql);
while ($row = mysqli_fetch_assoc($rs_result)) {
extract ($row);
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
ORDER BY merk ASC LIMIT $start_from, 5";
$rs_result = mysqli_query ($con,$sql);
while ($row = mysqli_fetch_assoc($rs_result)) {
extract ($row);
Nu wil ik dus een enkele row uit die tabellen halen, maar ook alle data.
Gewijzigd op 30/12/2013 13:56:37 door Wim Kasius
Als je gewoon fatsoenlijke foutafhandeling ingebouwd had ipv van dat afschuwelijke die(), had je dat zelf ook kunnen weten.
Je zet de gehele WHERE clause tussen haakjes, dat is de fout.
Gewijzigd op 30/12/2013 14:10:31 door Ger van Steenderen
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
//werkt niet
$voertuigdetails = "SELECT * FROM voertuigdata_voertuig WHERE hexon_nr = '$_GET[voertuig_nr]'
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldnt execute query.");
//werkt ook niet
$voertuigdetails = "SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
WHERE hexon_nr = '$_GET[voertuig_nr]'";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldnt execute query.");
$voertuigdetails = "SELECT * FROM voertuigdata_voertuig WHERE hexon_nr = '$_GET[voertuig_nr]'
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldnt execute query.");
//werkt ook niet
$voertuigdetails = "SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr
WHERE hexon_nr = '$_GET[voertuig_nr]'";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldnt execute query.");
Gewijzigd op 30/12/2013 14:20:23 door Wim Kasius
Want als je gewoon de sql error op het scherm print en hier vermeld, kunnen wij ook wat meer zeggen.
En dan krijg je met de aan zekerheid grenzende waarschijnlijk een melding met in de trend van:
Ambiguous column hexon_id in where clause
Die kolom staat nl. in alle vier tabellen en MySQL weet niet dat ze dezelfde waarde hebben in alle tabellen, dus je moet aangeven uit welke tabel die kolom komt(tabelnaam.kolomnaam)
Uitzondering hierop is als je ipv ON .... = ..... USING(hexon_id) zou gebruiken.
Al die belachelijke voorbeelden die gegeven worden op internet, daar heb ik niks aan, voorgekauwde informatie waarin maar 2 tabellen gebruikt worden.
Ook in de PHP handleiding kan ik geen duidelijke uitleg hierover vinden.
Hoe krijg ik alle kolommen uit 4 tabellen waar in deze 4 tabellen hexon_nr overeenkomt als key.
In elke tabel is een rij met dit nummer, als het in de ene tabel niet bestaat, bestaat het ook niet in een van de andere tabellen.
Gewijzigd op 02/01/2014 18:39:17 door Wim Kasius
Mislukt de query (zo ja: wat is dan de foutmelding van mysql_error()?)
krijg je vreemde of onverwachte resultaten?
"werkt niet" is namelijk een nogal breed begrip met 100 mogelijke oorzaken en ook een heleboel soorten van symptomen. (van geen resultaten tot verkeerde resultaten)
Wim Kasius op 02/01/2014 18:30:27:
Ik vraag alleen maar naar de juiste manier om een join query te bewerkstelligen.
En Ger geeft je het best mogelijke advies, waarmee je ongetwijfeld in een paar minuten die query werkend krijgt. Namelijk: bouw correct foutafhandeling in
Als jij dan vervolgens er voor kiest om dat advies gewoon te negeren (je goed recht overigens), dan wordt je helpen direct een stuk lastiger.
Maar goed, verder heeft Ger ook nog eens een fout aangewezen en ook daar doe je niets mee blijkbaar. Tsja.... als je geholpen wil worden is het wel zo netjes om op zijn minst de handreikingen die je krijgt ook uit te proberen.
Gewijzigd op 02/01/2014 19:17:36 door Erwin H
En
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
// GET veilig maken vooralleer je deze gebruiken gaat.
[code]<?php
$VeiligmakenGet=$_GET['voertuig_nr'];
// Geen gebruik maken van * om alles te selecteren voor de veiligheid.
$voertuigdetails =" SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr WHERE hexon_nr ='".$VeiligmakenGet."' ";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldn’t execute query.");
?>
// GET veilig maken vooralleer je deze gebruiken gaat.
[code]<?php
$VeiligmakenGet=$_GET['voertuig_nr'];
// Geen gebruik maken van * om alles te selecteren voor de veiligheid.
$voertuigdetails =" SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr WHERE hexon_nr ='".$VeiligmakenGet."' ";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldn’t execute query.");
?>
Erwin H op 02/01/2014 19:16:10:
En Ger geeft je het best mogelijke advies, waarmee je ongetwijfeld in een paar minuten die query werkend krijgt. Namelijk: bouw correct foutafhandeling in
Als jij dan vervolgens er voor kiest om dat advies gewoon te negeren (je goed recht overigens), dan wordt je helpen direct een stuk lastiger.
Maar goed, verder heeft Ger ook nog eens een fout aangewezen en ook daar doe je niets mee blijkbaar. Tsja.... als je geholpen wil worden is het wel zo netjes om op zijn minst de handreikingen die je krijgt ook uit te proberen.
Wim Kasius op 02/01/2014 18:30:27:
Ik vraag alleen maar naar de juiste manier om een join query te bewerkstelligen.
En Ger geeft je het best mogelijke advies, waarmee je ongetwijfeld in een paar minuten die query werkend krijgt. Namelijk: bouw correct foutafhandeling in
Als jij dan vervolgens er voor kiest om dat advies gewoon te negeren (je goed recht overigens), dan wordt je helpen direct een stuk lastiger.
Maar goed, verder heeft Ger ook nog eens een fout aangewezen en ook daar doe je niets mee blijkbaar. Tsja.... als je geholpen wil worden is het wel zo netjes om op zijn minst de handreikingen die je krijgt ook uit te proberen.
Ik negeer het advies echt niet, ik ben alleen nog maar net in php gedoken,en kwam niet tot het gewenste resultaat, en ik vind ook nergens een duidelijk voorbeeld met heldere duidelijke uitleg. Bedankt voor de reacties, ben al weer een stapje verder :)
Toevoeging op 02/01/2014 20:03:21:
Dankje, dit heeft me geholpen, maar t werkt niet..
Ik snap dat het veiliger is om geen * te gebruiken, echter is dan eigenlijk ook het nut van normaliseren verdwenen, en kan je net zo goed alles in een tabel proppen.
Of is een tabel met enkel hexon_nr als inhoud, en op basis daarvan joins maken beter?
Bart Smulders op 02/01/2014 19:21:00:
Probeer deze eens.
En
En
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// GET veilig maken vooralleer je deze gebruiken gaat.
[code]<?php
$VeiligmakenGet=$_GET['voertuig_nr'];
// Geen gebruik maken van * om alles te selecteren voor de veiligheid.
$voertuigdetails =" SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr WHERE hexon_nr ='".$VeiligmakenGet."' ";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldn’t execute query.");
?>
[/quote]
// GET veilig maken vooralleer je deze gebruiken gaat.
[code]<?php
$VeiligmakenGet=$_GET['voertuig_nr'];
// Geen gebruik maken van * om alles te selecteren voor de veiligheid.
$voertuigdetails =" SELECT * FROM voertuigdata_voertuig
INNER JOIN voertuigdata_details ON voertuigdata_voertuig.hexon_nr = voertuigdata_details.hexon_nr
INNER JOIN voertuigdata_spec ON voertuigdata_voertuig.hexon_nr = voertuigdata_spec.hexon_nr
INNER JOIN voertuigdata_financieel ON voertuigdata_voertuig.hexon_nr = voertuigdata_financieel.hexon_nr WHERE hexon_nr ='".$VeiligmakenGet."' ";
$results = mysqli_query($con,$voertuigdetails) or die ("Couldn’t execute query.");
?>
[/quote]
Gewijzigd op 02/01/2014 20:31:56 door Wim Kasius
De klok en de klepel?
@Wim
WHERE hexon_nr
Moet zijn
WHERE voertuigdata_voertuig.hexon_nr
Toevoeging op 02/01/2014 22:43:17:
>>Ik snap dat het veiliger is om geen * te gebruiken, echter is dan eigenlijk ook het nut van normaliseren verdwenen, en kan je net zo goed alles in een tabel proppen.
Wat een vreemde redenering!
Gewijzigd op 02/01/2014 22:42:09 door Ger van Steenderen
Bart Smulders op 02/01/2014 21:54:35:
zet dit eens in je pagina en vertel welke fout je dan krijgt maar allereerst verwijder je" or die ("Couldn’t execute query.")" in je query
Ah is t zo simpel dus?
Ger van Steenderen op 02/01/2014 22:41:23:
@Bart
De klok en de klepel?
@Wim
WHERE hexon_nr
Moet zijn
WHERE voertuigdata_voertuig.hexon_nr
Toevoeging op 02/01/2014 22:43:17:
>>Ik snap dat het veiliger is om geen * te gebruiken, echter is dan eigenlijk ook het nut van normaliseren verdwenen, en kan je net zo goed alles in een tabel proppen.
Wat een vreemde redenering!
De klok en de klepel?
@Wim
WHERE hexon_nr
Moet zijn
WHERE voertuigdata_voertuig.hexon_nr
Toevoeging op 02/01/2014 22:43:17:
>>Ik snap dat het veiliger is om geen * te gebruiken, echter is dan eigenlijk ook het nut van normaliseren verdwenen, en kan je net zo goed alles in een tabel proppen.
Wat een vreemde redenering!
Ger, wat betreft je reactie op mijn laatste zin, het ligt er natuurlijk wel aan voor welke doeleinden de database word gebruikt. De gegevens in de database komen in dit geval uit een xml bestand wat geautomatiseerd via FTP bij mij op de server komt, dit word door een php script wat ik al heb gemaakt verwerkt. Nu dacht ik dat het handig was om de data te splitsen, toepassingsgewijs, zodat ik snel doormiddel van select * from precies alle data kan laden welke ik nodig heb, zonder deze allemaal apart te hoeven definieeren. Omdat ik immers met select * from dan alle en geen op dat moment onnodige data laad. Zal misschien een foute redenatie zijn, maar dat is dan een les voor de toekomst.
En, dank je, ik ben er uit. Het werkt.
Gewijzigd op 03/01/2014 01:45:15 door Wim Kasius
In jouw specifieke geval heb je misschien inderdaad alle kolommen nodig. Zij het, dat je nu natuurlijk een paar keer dubbelop die hexon_nr krijgt. (php gooit de dubbelen wel aan de kant)
En de waarde is toevallig ook steeds gelijk.
Anders is het als je joint met tabellen die gelijknamige kolommen hebben. Bijvoorbeeld "naam" voor een persoon en "naam" voor de groep waartoe hij behoort. Dan is het maar de vraag welk van de 2 je binnenkrijgt.
Ander voordeel: als je in je code er rekening mee houdt dat er een "id" en "documentnaam" uit de query moet komen, dan is het op zich wel prettig als de query al bokt dat er geen kolom "id" is en je niet 85 regels verderop pas er achter komt dat bij het printen van $row['id'] er niets verschijnt, omdat er met select * gewoon een "docid" opgehaald werd.
Daarnaast is het maar zelden dat je van alle tabellen alle kolommen nodig hebt (uitzonderingen zijn er natuurlijk) en het is vaak zonde om al die data uit de database te halen. Van de database server over te dragen aan PHP, alles in een array te plaatsen en er vervolgens niets mee te doen.
Helemaal als je de titels van bijvoorbeeld boeken wilt hebben, is het niet nodig om de inhoud van het hele boek van een paar MB op te halen.
----
Over je eigenlijke probleem:
Je zegt "ah is het zo simpel"
Het was direct duidelijk geweest als je niet "couldn;t execute query" zou printen, maar de foutmelding van mysqli_error().
In dat geval geeft Mysql doorgaans heel duidelijk aan wat er mis is. En als het niet heel duidelijk is, dan toch op z'n minst een goede aanwijzing waar je het moet zoeken.