Hoi,

Ik moet in een listbox kunnen kiezen voor een auto (veld "AUTO" bevat het kenteken). Via een join wil ik uit een kilometerregistratie (tabel "uren")de laatste kilometerstand erbij weergeven. Een selectie van één auto gaat wel wanneer ik op kenteken opvraag, maar het lukt me nog niet om een lijstje te krijgen met alle auto's met daarbij per auto de laatste kilometerstand.

In de praktijk gaat het om bijvoorbeeld 10 auto's, waarbij er in de kilometerregistratie duizenden ritten staan.

<?php
$queryKM="SELECT Uren.AUTO, Uren.KM, Auto.merk FROM Uren INNER JOIN Auto ON Uren.AUTO = Auto.kenteken ORDER BY Uren.KM DESC LIMIT 1";
?>

Wanneer de query goed gaat is de verdere verwerking geen probleem meer.

Groeten, Gerrit
even een vraagje heb je een primaire sleutel die in beide tables zit? zo ja dan kan je het zo doen:


SELECT Auto.auto, Uren.kilometerstand
FROM Auto
INNER JOIN Uren
ON Auto.P_Id=Uren.P_Id
ORDER BY Uren.kilometerstand
Wat linkt een auto? Auto.id? of merk?

Je moet natuurlijk wel een onderscheid kunnen maken aan velden die gelinkt kunnen worden. Je selecteert bijvoorbeeld Auto.merk maar dan moet je ook auto.merk joinen op de uren.auto waar uren.auto dan ofwel het merk is of iets anders als id.
Reshadd farid op 03/02/2012 16:14:59

even een vraagje heb je een primaire sleutel die in beide tables zit? zo ja dan kan je het zo doen:


SELECT Auto.auto, Uren.kilometerstand
FROM Auto
INNER JOIN Uren
ON Auto.P_Id=Uren.P_Id
ORDER BY Uren.kilometerstand



Nee, de primary key 'moet' naar een foreign key verwijzen. Dus zou bijvoorbeeld Uren.auto_id kunnen zijn.
Als je er vanuit kan gaan dat de kilometerstand alleen maar oploopt en nooit afloopt (lijkt mij logisch, maar je weet nooit...) dan kan je met een MAX() functie alleen die uitlezen en met GROUP BY het splitsen per auto. Zoiets dus:


SELECT Uren.AUTO, MAX(Uren.KM), Auto.merk 
FROM Uren 
INNER JOIN Auto ON Uren.AUTO = Auto.kenteken 
GROUP BY Uren.auto, auto.merk

@jaron T dat bedoelde ik sorry :P

[size=xsmall]Toevoeging op 03/02/2012 16:22:04:[/size]

Erwin H op 03/02/2012 16:19:28

Als je er vanuit kan gaan dat de kilometerstand alleen maar oploopt en nooit afloopt (lijkt mij logisch, maar je weet nooit...) dan kan je met een MAX() functie alleen die uitlezen en met GROUP BY het splitsen per auto. Zoiets dus:


SELECT Uren.AUTO, MAX(Uren.KM), Auto.merk 
FROM Uren 
INNER JOIN Auto ON Uren.AUTO = Auto.kenteken 
GROUP BY Uren.auto, auto.merk


je doet nu INNER JOIN Auto ON uren.AUTO = Auto.kenteken

dus dan heb je de uren en een kenteken toch?
maar moeten die velden niet matchen?



Uren.AUTO bevat net als Auto.kenteken het kenteken als uniek kenmerk. Dit is in geen van beide tabellen de primaire sleutel.

Met de laatste code van Reshadd krijg ik de kentekens in beeld, zonder de kilometerstanden. Verder zijn de kentekens die nog niet in de kilometerregistratie staan vermeld NIET meer zichtbaar. Een nieuwe auto kun je die dus niet kiezen.
@gerrit heb je wel het e.e.a. aangepast aan je database? de p_id enz ? heb je misschien een online voorbeeld?
Om te beginnen zou ik dan eerst Uren.AUTO hernoemen naar Kenteken. Maar wat Reshadd heeft verteld over ID`s is wel raadzaam. Zorg ervoor dat tabellen een unieke primary key hebben. Dat scheelt een berg.
In de database kan ik niets aanpassen omdat een ander programma hier ook gebruik van maakt. Ik ben bezig om een al jaren bestaande database van een bestaand pakket nu via PHP extern toegankelijk te maken.

De tabel "auto" heeft "AUTOINCREMENT" als primary key (autoincrementing...); voor "uren" is dit eveneens het veld "AUTOINCREMENT". Deze zijn int(11). Het KM veld kan in sommige records ook null waarden bevatten of 0 zijn (urenregel zonder gebruik auto).

Join kan m.i. op uren.auto en auto.kenteken (bevat steeds het kenteken).
Gerrit broekhuis op 03/02/2012 16:43:02
Met de laatste code van Reshadd krijg ik de kentekens in beeld, zonder de kilometerstanden.

Post svp de code die je daadwerkelijk gebruikt. Hier hebben we weinig aan, omdat de ervaring leert dat mensen nogal eens belangrijke punten vergeten of tikfouten maken bij het copieren. Als je de code post die jij gebruikt hebben we het altijd over hetzelfde.

Reageren