Left Join und Order By
Chrisi
- datenbank
Hallo zusammen,
ich habe mal wieder ein wenige Denkprobleme bei einer etwas längeren SQL Abfrage:
SELECT *
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
GROUP BY u.UID
ORDER BY u.UID DESC
Die Abfrage holt aus der Tabelle user u. pictures die zutreffenden Daten was soweit prima klappt. Nun gibt es aber die Möglichkeit in der Tabelle pictures eine Sortierung der Fotos festzulegen, dazu habe ich eine Spalte names "sort" angelegt.
Diese Spalte kann den Wert 0 oder 1 enthalten, womit der User festlegen kann welches Bild vorrangig behandelt werden soll (Vorschaubild).
Das Problem ist das ich nun bei der Verknüfung der Tabellen mit LEFT JOIN jeweils den Eintrag unter picture vorrangig verknüpfen will der den höchsten Wert hat.
Ich habe dazu versucht zu sortieren:
ORDER BY u.UID DESC, p.sort DESC
Aber leider ohne Erfolg :)
Ich würde mich mal wieder freuen wenn mir jemand weiterhelfen kann ?
Viele Grüße & danke ! Chrisi ...
Hallo Chrisi
Hallo zusammen,
ich habe mal wieder ein wenige Denkprobleme bei einer etwas längeren SQL Abfrage:
SELECT *
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
GROUP BY u.UID
ORDER BY u.UID DESCDie Abfrage holt aus der Tabelle user u. pictures die zutreffenden Daten was soweit prima klappt. Nun gibt es aber die Möglichkeit in der Tabelle pictures eine Sortierung der Fotos festzulegen, dazu habe ich eine Spalte names "sort" angelegt.
Diese Spalte kann den Wert 0 oder 1 enthalten, womit der User festlegen kann welches Bild vorrangig behandelt werden soll (Vorschaubild).Das Problem ist das ich nun bei der Verknüfung der Tabellen mit LEFT JOIN jeweils den Eintrag unter picture vorrangig verknüpfen will der den höchsten Wert hat.
Ich habe dazu versucht zu sortieren:
ORDER BY u.UID DESC, p.sort DESC
Aber leider ohne Erfolg :)
was heißt das?
Wenn ich dich richtig verstanden habe sollte es funktionieren.
Struppi.
yo,
Die Abfrage holt aus der Tabelle user u. pictures die zutreffenden Daten was soweit prima klappt.
da habe ich so meine zweifel. entweder gibt es eine 1:1 beziehung zwischen den tabellen, dann wäre das GROUP BY überflüssig. oder aber das SELECT * und das GROUP BY u.UID passen nicht zusammen. ich denke mal, da es hier keine fehlermeldung gibt, benutzt du mysql. asche über das haupt der entwickler.
Diese Spalte kann den Wert 0 oder 1 enthalten, womit der User festlegen kann welches Bild vorrangig behandelt werden soll (Vorschaubild).
damit wäre auch die 1:1 beziehung hinfällig und deine query ist einfach mal falsch, auch wenn eben mysql keinen fehler ausgibt.
Ich habe dazu versucht zu sortieren:
ORDER BY u.UID DESC, p.sort DESC
Aber leider ohne Erfolg :)
das ist dann eine folge deiner falschen query, er nimmt nämlich für jede UID zufällig genau einen datensatz der mehreren zugehörigen datensätze der picture tabelle und somit ist es auch hinfällig diesen einen datensatz sortieren zu wollen.
Ilja
Hi Ilja,
das SELECT * und das GROUP BY u.UID passen nicht zusammen. ich >>> denke mal, da es hier keine fehlermeldung gibt
Das * ist nur für euch hier, wegen der Lesbarkeit, ich nutze oben COUNT() um die gefunden Datensätze zu zählen, daher auch meine GROUP BY ... :) Wenn ich richtig liege habe ich bei den Tabellen eine 1:n Beziehung ... (Ich nutze MySQL 4.1.12)
Ein User kann mehrere Bilder haben.
Hier mal die ganze Query:
SELECT COUNT(u.UID) as rows, u.username, u.UID, p.PID
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
GROUP BY u.UID
ORDER BY u.UID DESC
er nimmt nämlich für jede UID zufällig genau einen datensatz der >>> mehreren zugehörigen datensätze der picture tabelle und somit >>> ist es auch hinfällig diesen einen datensatz sortieren zu wollen.
Mhhh, ich glaube ich versteh was du mir sagen willst. Wenn ich jetzt richtig verstanden habe kann ich die Abfrage so wie ich Sie benötige garnicht in einer Query absetzen, weil ich eine 1:n Beziehung habe ?
Ich vermute jetzt einfach mal das ich 2 Abfragen starten muss, einmal die Userdaten und einmal die Pictures ?
Danke dir mal wieder Ilja !
Grüße, Chrisi ...
yo,
SELECT COUNT(u.UID) as rows, u.username, u.UID, p.PID
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
GROUP BY u.UID
ORDER BY u.UID DESC
auch diese query ohne * ist falsch. mysql geht da einen dummen weg und gibt leider keine fehlermeldung aus. aber ich rate dir jede spalte, die keine aggregat-funktion ist mit in die group by klausel reinzunehmen, dann bist du immer auf der sicheren seite.
Mhhh, ich glaube ich versteh was du mir sagen willst. Wenn ich jetzt richtig verstanden habe kann ich die Abfrage so wie ich Sie benötige garnicht in einer Query absetzen, weil ich eine 1:n Beziehung habe ?
fast, du kannst sie schon in einer query absetzen (je nach dbms und version), aber nicht so wie du es gemacht hast.
so wie es aussieht, kann deine version von mysql unterabfragen, und dann geht es auch mit einer abfrage. eigentlich brauchst du in deinem fale den GROUP BY nur für die Count () Aggregatfunktion. du kannst entweder diese einfach weglassen und dann den LEFT JOIN abschicken.
SELECT u.username, u.UID, p.PID
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
ORDER BY u.UID DESC, p.UID DESC
oder aber du machst es mit unterabfragen, falls du den COUNT() auf jeden fall mit ins boot nehmen willst. ist ein wenig "unschön", da es sich um eine korrelierende abfrage handelt.
SELECT (SELECT COUNT(*) FROM pictures AS p2 WHERE p2.UID = p.UID)
AS rows, u.username, u.UID, p.PID
FROM user AS u
LEFT JOIN pictures AS p ON (u.UID = p.UID)
WHERE u.status = 1
ORDER BY u.UID DESC, p.UID DESC
Ilja
yo,
sollte natürlich
ORDER BY u.UID DESC, p.sort DESC
heißen
Ilja