Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.38 veröffentlicht (30.04.24)


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste
[MySQL] UNION zerstört Sortierung
#1
Hi MyBBCoder,

ich sitze momentan an einem MySQL-Statement, was einfach nicht das gewünschte Ergebnis bringen will.

Sinn des Statements:
Ich habe eine Tabelle ft_tracks, aus der ich die Tracks rausladen und nach Author sortieren will. Das Problem ist, dass der User 'Psyduck' (uid 4) eine spezielle Aufgabe hat und als 'FunTrackers' in der Liste erscheinen soll. Eine einfache Sortierung ist also nicht möglich, da ja so mit 'Psyduck' und nicht mit 'FunTrackers' sortiert wird.

Meine Idee nun:
Zuerst alle Tracks von Autoren, die vor 'FunTrackers' kommen, raussuchen. Als zweites die von Psyduck selbst (der Username wird dann im PHP Script entsprechend angepasst), als letztes dann alle, die mit Namen nach 'FunTrackers' kommen.

Die einzelnen Unterabfragen sind dabei zuerst nach dem Autor (Username), und als zweites nach Trackname (Name) sortiert. 2 Unions sollen diese 3 Listen dann "zusammenschweißen".

Hier mal das gesamte Statement:
Code:
SELECT r.tid, r.uid, r.name, r.author, r.envi, r.difficulty, r.`release` FROM
(
    (
        SELECT t.tid, t.uid, t.name, t.envi, t.difficulty, t.release, t.beta, u.username AS author
        FROM ft_tracks t
        LEFT JOIN ft_users u ON t.uid=u.uid
        WHERE u.username<'FunTrackers'
        AND u.uid!='4'
        ORDER BY u.username ASC, t.name ASC
    )
    UNION
    (
        SELECT t.tid, t.uid, t.name, t.envi, t.difficulty, t.release, t.beta, 'Psyduck' AS author
        FROM ft_tracks t
        WHERE t.uid='4'
        ORDER BY t.name ASC
    )
    UNION
    (
        SELECT t.tid, t.uid, t.name, t.envi, t.difficulty, t.release, t.beta, u.username AS author
        FROM ft_tracks t
        LEFT JOIN ft_users u ON t.uid=u.uid
        WHERE u.username>'FunTrackers'
        AND u.uid!='4'
        ORDER BY u.username ASC, t.name ASC
    )
) r
WHERE beta='0'
LIMIT 0,15

Das Problem:
Führe ich die Unterabfragen einzeln aus, funktioniert alles: Die Tracks sind richtig sortiert.
Sobald ich aber ein UNION mit reinbringe, wird die Sortierung anscheinend wieder über den Haufen geworfen, ein Autor mit "bo" erscheint auf einmal vor "Am" (und die Tracks ein und desselben Autors sind auch nicht mehr nach Trackname sortiert)

Ich hoffe das Problem wird soweit klar, und mir kann jemand helfen Sad

MfG Zwoetzen
Was ist der Unterschied zwischen der Politik und der Informatik?
In der Informatik ignoriert man führende Nullen...
Zitieren
#2
Konnte das Problem mit dem UNION zwar nicht direkt lösen, habe aber einen anderen Ansatz für das Statement gefunden:
Code:
SELECT t.tid, t.uid, t.name, t.envi, t.difficulty, t.release,
    IF(u.username='Psyduck', 'FunTrackers', u.username) AS author
    -- CASE u.username WHEN 'Psyduck' THEN 'FunTrackers' ELSE u.username END AS author
FROM ft_tracks t
LEFT JOIN ft_users u ON t.uid=u.uid
WHERE beta='0'
ORDER BY author ASC, t.name ASC
LIMIT 0,15
Hier wird nun direkt im Falle von "Psyduck" als Autor dieser in "FunTrackers" umgewandelt, sodass auch ein direktes Sortieren möglich ist.
Habe neben der Variante mit IF() zur Behandlung eines einzelnen Wertes (2. Zeile) auch mal die Möglichkeit des CASE (3. Zeile) angeführt, wo dann auch weitere WHEN-THEN-Fälle eingefügt werden können. Vielleicht hilft das ja jemandem mal weiter Toungue
(Siehe auch: Ablaufsteuerungsfunktionen )

Stellt sich aber trotzdem die Frage, wieso die UNIONs nicht wie gewünscht funktionieren und die Sortierung wieder durcheinander bringen. Falls jemand eine Antwort hat, kann er sie ja noch posten, ich markiere das Thema aber trotzdem mal als Erledigt Wink

PS: Bin übrigens heut früh in meinen Scripten zur Vorlesung "Datenbanksysteme" auf das CASE gestoßen, es zahlt sich also doch aus, wenn man für die Prüfung lernt xDDD
Was ist der Unterschied zwischen der Politik und der Informatik?
In der Informatik ignoriert man führende Nullen...
Zitieren