2016-04-11 11 views
0

Ich bin versucht, die folgenden Informationen aus einer Tabelle zu erhalten:MySQL Query - Mischung aus Sortieren und Gruppieren

  • durch "b" Sortieren (Tabelle A aufsteigend, absteigend Tabelle B)
  • alle „u "mit einem bestimmten Wert erscheint zuerst (in diesem Beispiel u = 3) - dann ist die Reihenfolge nicht wichtig
  • N (NULL) immer am Ende
  • nein" r "darf zweimal vorkommen (aber alle anders" r " muss vorhanden sein)

Mit "ORDER BY IFNULL (u, 99999999)! = 3, u, b" funktioniert das Kriterium 1, 2 und 3, aber für die letzte habe ich keine Ahnung.

Mit DISTINCT erreiche ich nicht das Ziel, genau wie bei GROUP BY.

Hat jemand eine Idee? Vielen Dank im Voraus.

start table   target table A 
+----------------+ +----------------+ 
| id | r | u | b | | id | r | u | b | 
+----------------+ +----------------+ 
| 1 | 1 | 1 | 9 | | 18 | 5 | 3 | 1 | 
| 2 | 1 | 3 | 4 | | 2 | 1 | 3 | 4 | 
| 3 | 1 | 4 | 6 | | 15 | 4 | 3 | 7 | 
| 4 | 1 | 5 | 5 | | 11 | 3 | 3 | 8 | 
| 5 | 2 | 1 | 2 | | * | 2 | * | * | 
| 6 | 2 | 2 | 1 | | 21 | 6 | N | N | 
| 7 | 2 | 4 | 5 | +----------------+ 
| 8 | 2 | 5 | 7 | 
| 9 | 3 | 1 | 4 | 
| 10 | 3 | 2 | 3 | 
| 11 | 3 | 3 | 8 | 
| 12 | 3 | 5 | 2 | target table B 
| 13 | 4 | 1 | 3 | +----------------+ 
| 14 | 4 | 2 | 2 | | id | r | u | b | 
| 15 | 4 | 3 | 7 | +----------------+ 
| 16 | 4 | 4 | 6 | | 11 | 3 | 3 | 8 | 
| 17 | 5 | 2 | 9 | | 15 | 4 | 3 | 7 | 
| 18 | 5 | 3 | 1 | | 2 | 1 | 3 | 4 | 
| 19 | 5 | 4 | 6 | | 18 | 5 | 3 | 1 | 
| 20 | 5 | 5 | 4 | | * | 2 | * | * | 
| 21 | 6 | N | N | | 21 | 6 | N | N | 
+----------------+ +----------------+ 
+0

Wie wählen Sie, welche Zeilen zu nehmen, wenn es mehr als zwei Werte auf der 'R' Spalte? Und ich bin mir nicht sicher, ob ich dich verstanden habe, ist 'targetA' und' targetB' die Ausgabe von 'StartTable'? – sagi

+1

Können Sie Ihren Code anzeigen? –

+0

Starttabelle ist die Tabelle in der Datenbank und Zieltabellen sind meine gewünschten Ergebnisse – Seamanx

Antwort

2
SELECT * 
FROM mytable m 
WHERE id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.r = m.r 
     ORDER BY 
       u IS NULL, u = 3 DESC, b, id 
     LIMIT 1 
     ) 
ORDER BY 
     u IS NULL, u = 3 DESC, b 

Update:

SELECT * 
FROM objects o 
LEFT JOIN 
     ratings r 
ON  r.id = COALESCE(
     (
     SELECT id 
     FROM ratings 
     WHERE object_id = o.id 
       AND user_id = :myuser 
     ORDER BY 
       rating DESC 
     LIMIT 1 
     ), 
     (
     SELECT id 
     FROM ratings 
     WHERE object_id = o.id 
     ORDER BY 
       rating DESC 
     LIMIT 1 
     ) 
     ) 
+0

Danke, das funktioniert! – Seamanx

+0

Hat diese Konstruktion einen besonderen Namen? Ich möchte das verstehen, aber ich kann nicht! – Seamanx

+0

@Seamanx: korrelierte Unterabfrage, glaube ich. In allen anderen Hauptsystemen hätten Sie nur die Fensterfunktion 'ROW_NUMBER' verwendet, aber MySQL unterstützt sie nicht. – Quassnoi