Detta borde funka.
select
Anv.anvID,
Anv.anvForNamn,
Anv.AnvEftNamn,
Anv.AnvInitNamn,
Anv_Tid.TidTyp,
Anv_Tid.TidOpen
from
Anv
left join
Anv_Tid on Anv.AnvID = Anv_Tid.AnvID
Databaser & SQLur Databashanterare & SQL
4 svar · 457 visningar · startad av KoTTeN
Ska få ut information ur två tabeller tillsammans. Tabellerna ser ut som följande:
Användare
AnvID AnvNamn
--------------------
1 Ronny
2 Leif
Tiddata
Tid AnvID
---------------
12:43 1
13:43 1
01:13 2
Nu vill jag presentera Användarnamn och senaste inlagda tiden. Exempelvis Ronny 12:43. Jag har testat inner join, men då får jag två rader om Ronny, en för varje tid som finns inlagd. Hur gör man för att enbart visa den senaste inlagda tiden? Koden som den ser ut nu:
SELECT Anv.AnvID, Anv.AnvForNamn, Anv.AnvEftNamn, Anv.AnvInitNamn, Anv_Tid.TidTyp, Anv_Tid.TidOpen
FROM Anv
INNER JOIN Anv_Tid
ON Anv.AnvID = Anv_Tid.AnvID
Detta borde funka.
select
Anv.anvID,
Anv.anvForNamn,
Anv.AnvEftNamn,
Anv.AnvInitNamn,
Anv_Tid.TidTyp,
Anv_Tid.TidOpen
from
Anv
left join
Anv_Tid on Anv.AnvID = Anv_Tid.AnvID
Tyvärr så blir resultatet den samma. Jag får fram dubletter av Ronny. :(
Det är en join du ska ha, men det är lite till... Låt Max vara med också :-)
SELECT anvForNamn, anvEftNamn, MAX(tid)
FROM Anv
LEFT JOIN Anv_Tid USING (AnvID)
GROUP BY Anv.AnvID
MAX() ger ju det högsta värdet. Observera dock att kolumnen i det fallet inte får vara enbart ett klockslag, utan du måste ha med datum också. Ett timestamp med andra ord.
Satt och pillade lite, kom fram till samma resultat som tydal.
select
a.AnvID,
a.AnvNamn,
max(date_format(at.TidTyp, '%H:%i')) as TidTyp
from
anv a
left join
anv_tid at on a.AnvID = at.AnvID
group by
a.AnvID,
a.AnvNamn
Men, som LarsG lärde mig.
LarsG skrev:
Alla ickeaggregerade kolumner i selectlistan måste vara med i group by.
La även dit formateringen på tiden så att sekunder inte kommer med.