SQL LEFT JOIN - möchte nur 1 DS

A

achim89

Gast
Ich steh gerade vor ein problem das is einfach nicht gelöst bekomme

und zwar hab ich zwei tabellen

eine mit benutzer und eine mit loginzeiten

ich möchte mir nun eine abfrage generieren, die mir zu jedem benutzer die letzte loginzeit zeigt

ich dachte mir, dazu brauch ich aufjedenfall alle benutzer und dazu, wenn verfügbar, die letzte loginzeit

sprich
Code:
SELECT * FROM user AS u LEFT JOIN zeiten AS z ON u.id = z.id

durch diese abfrage bekomme ich alle benutzer und alle loginzeiten, ich möchte die loginzeiten aber immer auf eine, die aktuellste, beschränken
 
dann mach halt mach halt noch sowas wie
Code:
ORDER BY z.zeit DESC
 LIMIT 1
dazu
 
das LIMIT liefert mir ja aber dann nur ein datensatz für die gesamte abfrage

ich möchte ja alle benutzer auflisten
 
Das ganze machst Du über ein Aggregat:

select MAX(z.zeit) as last_login
u.id
FROM user AS u LEFT JOIN zeiten AS z ON u.id = z.id
Group by u.id

Bringt Dir zu jedem User den höchsten (und damit letzten) Wert seines Login. Möchtest Du User ausschliessen, die noch nie eingeloggt waren, machst Du einen INNER Join draus.
 
Ausm Stegreif würd ich jetzt mit MAX arbeiten.
Kanns aber grad nicht genau testen.

So in etwa (nicht geprüft)

Select * from user left join (Select id, max(login) from zeiten z group by id) on user.id = z.id

Verdammt is das lang her. Musst mal testen wies genau läuft, aber vom Grundprinzip.

Edit: Elioth war schneller ;)
 
@achim89
dann brauchst du zwei Abfragen
einmal die max Zeit und einmal die Usertabelle

den Left join kannst du dir ja dann sparen

oder du bleibst bei deiner ersten Abfrage und suchst die höchste Zeit dann in PHP, was auch ginge ist nach dem Timestamp zu sortieren und dann den letzten/ersten abgreifen und dessen Zeit ausgeben - kommt aufs selbe raus
 
das habe ich glaub ich noch nicht ganz verstanden

ich habe jetzt
Code:
SELECT u.*, MAX(z.ein) FROM user AS u LEFT JOIN zeiten AS z ON z.id = u.id ORDER BY z.ein ASC
das statement liefert mir aber auch nur ein DS wegen MAX
Ergänzung ()

aber das ganze muss doch auch in sql realisierbar sein
denn in meiner php ist der aufbau immer gleich, nur die statements ändern sich
dann müsst sich für einzelne fälle seperat etwas schreiben, welches mir das ergebnis liefert was bestimmt auch deutlich langsamer vonstatten geht als wenn mysql mir die datensätze schon vorsortiert liefert und ich einfach nur noch ausgeben muss
 
Die Abfrage von Elioth müsste doch genau so funktionieren wie sie dort steht?
Nur das u.id wirst du halt durch sowas wie u.name ersetzen wollen.
Du brauchst den "group by u.id" sonst kriegst du eben nur einen Datensatz.
 
stimmt
mit group by funktioniert es
=)

danke damit wär das thema wohl erledigt
 
Zurück
Oben