
5322
28.09.2005, aktualisiert um 15:54:03 Uhr
MySQL Left Join sortieren
Hallo zusammen,
Habe ein Problem mit einem MySQL - Befehl:
SELECT
member.id,
member.membername,
urlaub.urlaubanfang,
urlaub.urlaubende,
urlaub.urlaubinfo
FROM member
LEFT JOIN urlaub
ON urlaub.memberid = member.id
GROUP BY member.id
Der funktioniert soweit, einzigstes Problem ist das ich immer den ersten Urlaub des Members aus der Tabelle urlaub bekomme. Möchte aber den haben, der als nächstes kommt! Kann ja sein das da die Reihenfolge nicht richtig ist. Möchte also praktisch den LEFT JOIN sortieren!
Kann mir da eben einer helfen!?
Mit ORDER BY member.id, urlaub.urlaubanfang klappts nicht, da krieg ich die Endtabelle nach memberid und urlaubsanfang sortiert...
Vielen Dank im Vorraus!
Habe ein Problem mit einem MySQL - Befehl:
SELECT
member.id,
member.membername,
urlaub.urlaubanfang,
urlaub.urlaubende,
urlaub.urlaubinfo
FROM member
LEFT JOIN urlaub
ON urlaub.memberid = member.id
GROUP BY member.id
Der funktioniert soweit, einzigstes Problem ist das ich immer den ersten Urlaub des Members aus der Tabelle urlaub bekomme. Möchte aber den haben, der als nächstes kommt! Kann ja sein das da die Reihenfolge nicht richtig ist. Möchte also praktisch den LEFT JOIN sortieren!
Kann mir da eben einer helfen!?
Mit ORDER BY member.id, urlaub.urlaubanfang klappts nicht, da krieg ich die Endtabelle nach memberid und urlaubsanfang sortiert...
Vielen Dank im Vorraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 16875
Url: https://administrator.de/forum/mysql-left-join-sortieren-16875.html
Ausgedruckt am: 01.05.2025 um 19:05 Uhr
13 Kommentare
Neuester Kommentar

tja, da fehlt Dir wohl eine WHERE-Bedingung 
größer als soll eigentlich eine schließende spitze Klammer sein, aber das unterdrückt die Boardsoftware.
Ich weiss nicht, ob MySQL die GETDATE()-Funktion kennt. Ansonsten musst Du da die analoge Funktion für den aktuellen Timestamp einsetzen.
dba
SELECT blafasel FROM ... die JOINS WHERE urlaub.urlaubanfang größer als GETDATE() GROUP ...
größer als soll eigentlich eine schließende spitze Klammer sein, aber das unterdrückt die Boardsoftware.
Ich weiss nicht, ob MySQL die GETDATE()-Funktion kennt. Ansonsten musst Du da die analoge Funktion für den aktuellen Timestamp einsetzen.
dba

Was genau willst Du denn in dem Resultset haben und wie soll es ggf. sortiert sein?
dba
dba

Du unterliegst da einem Denkfehler, glaube ich.
Ein Resultset wird immer erst nach dem Joinen in die entsprechende Sortierung gebracht. Du musst also zunächst mal die Joins definieren, dann definieren, was Du an Daten im Resultset haben willst (WHERE) und schließlich sortieren (ORDER BY). Das ganze kannst Du dann noch einschränken mit Schlüsselworten wie DISTINCT oder TOP.
Wir bauen ein Beispiel:
Wenn wir jetzt einfach die beiden Tabellen joinen
erhalten wir ein Resultset, in dem zu jedem Member die einzelnen Records in der Tabelle urlaub aufgeführt sind. Das können wir jetzt sortieren, bspw.:
Deine Aussage zur Verwednung des group by und daraus resultierenden einzelnen Ergebnissatzes ist nicht richtig. Bei Dir kommen da sicher noch andere Umstände ins Spiel, die das Ergebnis fälschlicherweise als fast richtig aussehen lassen.
Ich komm' nochmal auf meine Frage zurück: Was soll Dir das Resultset als Ergebnis liefern?
dba
Ein Resultset wird immer erst nach dem Joinen in die entsprechende Sortierung gebracht. Du musst also zunächst mal die Joins definieren, dann definieren, was Du an Daten im Resultset haben willst (WHERE) und schließlich sortieren (ORDER BY). Das ganze kannst Du dann noch einschränken mit Schlüsselworten wie DISTINCT oder TOP.
Wir bauen ein Beispiel:
create table member
(
memberid int,
name varchar(50)
)
create table urlaub
(
memberid int,
beginn datetime,
ende datetime
)
Wenn wir jetzt einfach die beiden Tabellen joinen
select * from member m inner join urlaub u on m.memberid = u.memberid
erhalten wir ein Resultset, in dem zu jedem Member die einzelnen Records in der Tabelle urlaub aufgeführt sind. Das können wir jetzt sortieren, bspw.:
select *
from member m
inner join urlaub u
on m.memberid = u.memberid
order by m.memberid, u.beginn
Deine Aussage zur Verwednung des group by und daraus resultierenden einzelnen Ergebnissatzes ist nicht richtig. Bei Dir kommen da sicher noch andere Umstände ins Spiel, die das Ergebnis fälschlicherweise als fast richtig aussehen lassen.
Ich komm' nochmal auf meine Frage zurück: Was soll Dir das Resultset als Ergebnis liefern?
dba

select
m.memberid,
m.name,
max(u.beginn) as anfang
from
member m
inner join urlaub u
on m.memberid = u.memberid
group by
m.memberid,
m.name
Meinst Du so?

Probier das 
select
hlp.mid,
hlp.nam,
u.beginn,
u.ende
from
(
select
mem.memberid mid,
mem.name nam,
max(url.beginn) as anf
from
member mem
inner join urlaub url
on mem.memberid = url.memberid
group by
mem.memberid,
mem.name
) as hlp
inner join urlaub u
on u.beginn = hlp.anf

DAS kann ich Dir nicht beantworten. Vielleicht kommen da auch Unterschiede zwischen MySQL und dem SQL Server, den ich hier verwende, zum Vorschein. Ich hab' nochmal den Code aus meinem Posting importiert und laufen lassen, um Übertragunssfehler auszuschliessen. Als Ergebnis bekomme ich das hier:
mid nam beginn ende
1 richard 2005-01-01 00:12:00.000 2005-01-02 00:12:00.000
2 erich 2005-01-03 00:12:00.000 2005-02-03 00:12:00.000
3 peter 2007-01-10 00:12:00.000 2007-11-11 00:12:00.000
Sieht doch eigentlich gut aus. Was die Fehlermeldung jetzt bei Dir verursacht, müsstest Du mal herausfinden und dann einen Workaround für bauen.
Vielleicht stoert er sich an 'url' oder 'mem' als Alias? Ändere doch mal in u2 und m2, die beiden. Mehr fällt mir dazu jetzt nicht ein.
sorry, dba
mid nam beginn ende
1 richard 2005-01-01 00:12:00.000 2005-01-02 00:12:00.000
2 erich 2005-01-03 00:12:00.000 2005-02-03 00:12:00.000
3 peter 2007-01-10 00:12:00.000 2007-11-11 00:12:00.000
Sieht doch eigentlich gut aus. Was die Fehlermeldung jetzt bei Dir verursacht, müsstest Du mal herausfinden und dann einen Workaround für bauen.
Vielleicht stoert er sich an 'url' oder 'mem' als Alias? Ändere doch mal in u2 und m2, die beiden. Mehr fällt mir dazu jetzt nicht ein.
sorry, dba

Dann mach's in zwei Schritten, den Subselect in eine Hilfstabelle [insert into...] und danach dann den eigentlichen Select mit dem Join auf die Hilfstabelle.
Das sollte doch funktionieren.
Ansonsten bin ich gleich erstmal weg ,-)
dba
Das sollte doch funktionieren.
Ansonsten bin ich gleich erstmal weg ,-)
dba