versuche schon seit geraumer Zeit folgende - auf den ersten Blick einfache - Information aus einer Tabelle zu erhalten: - Sortierung nach "b" (bei Tabelle A aufwärts, bei Tabelle B abwärts) - Alle "u" mit einem bestimmten Wert erscheinen zuerst (im Beispiel u=3) - danach ist die Reihenfolge unwichtig - N (NULL) immer am Ende - kein "r" darf doppelt vorkommen (aber alle verschiedenen "r" müssen vorhanden sein)
Mit "ORDER BY IFNULL(u, 99999999) != 3 , u , b" gelingt mir schon mal Kriterium 1, 2 und 3, aber beim Letzten beiße ich mir die Zähne aus. Mit DISTINCT erreiche ich das Ziel nicht, genauso wenig wie mit GROUP BY.
Leider unterstützt MySql keine Tabellenfunktionen (zumindest soweit mir bekannt). Deshalb hier zunächst eine SQL-Anweisung, die die gewünschten Daten liefert:
select CAST(id as nvarchar), CAST(r as nvarchar), cast(u as nvarchar), CAST(b as nvarchar) from Ausgangstabelle where (u=3 OR u IS NULL) UNION SELECT '*', r, '*', '*' FROM Ausgangstabelle WHERE Ausgangstabelle.r not in (SELECT DISTINCT r FROM Ausgangstabelle where (u=3 OR u IS NULL))
Ich habe die Syntax vom SQL-Server verwendet. Sie sollte sich auf MySql übertragen lassen. Die Idee: Zunächst alle "echten" Daten aus der Ausgangstabelle sammeln und danach in der UNION mit den fehlenden r-Werten verbinden.
Wenn man das Ganze in eine temporäre Sicht verwandelt, sollte auch die Sortierung möglich sein.
Meine Empfehlung wäre allerdings, das Ganze in einer Methode im Client zu machen und über eine Collectionklasse zu gehen. Da wäre man deutlich flexibler.
Vielen Dank für die hilfreichen Anregungen. UNION und vor allem WHERE NOT IN waren für mich die richtigen Schlüsselwörter. Habe am Ende noch ORDER BY u != 3, u, b benutzt um die Sortierung zu realisieren.
UNION und vor allem WHERE NOT IN waren für mich die richtigen Schlüsselwörter.
Habe am Ende noch ORDER BY u != 3, u, b benutzt um die Sortierung zu realisieren.