MySQL - Kontrollieren Sie, welche Zeile von einer Gruppe zurückgegeben wird



Answers

Ich denke, das würde es tun, nicht sicher, ob es das Beste oder das Schnellste ist.

SELECT * FROM table 
WHERE (id, version_id) IN 
  (SELECT id, MAX(version_id) FROM table GROUP BY id)
Question

Ich habe eine Datenbanktabelle wie folgt:

id    version_id    field1    field2
1     1             texta      text1
1     2             textb      text2
2     1             textc      text3
2     2             textd      text4
2     3             texte      text5

Wenn Sie es nicht ausgearbeitet haben, enthält es eine Reihe von Versionen einer Zeile und dann einige Textdaten.

Ich möchte es abfragen und die Version mit der höchsten Nummer für jede ID zurückgeben. (also die zweite und letzte Zeile nur im obigen).

Ich habe versucht, während der Bestellung von Version_ID DESC Group verwenden, aber es scheint nach seiner gruppiert zu bestellen, so dass dies nicht funktioniert.

Hat jemand irgendwelche Ideen? Ich kann nicht glauben, dass es nicht möglich ist!

AKTUALISIEREN:

Finde das, was funktioniert, aber benutzt eine Unterabfrage:

SELECT *
FROM (SELECT * FROM table ORDER BY version_id DESC) t1
GROUP BY t1.id



Diese Abfrage führt den Job ohne eine Gruppe durch:

SELECT * FROM table AS t
LEFT JOIN table AS t2 
    ON t.id=t2.id 
    AND t.version_id < t2.version_id
WHERE t2.id IS NULL

Es benötigt keine temporären Tabellen.




Normalerweise mache ich das mit einer Unterabfrage:

Wählen Sie id, version_id, field1, field2 aus der Datentabelle als dt aus, wobei id = (wählen Sie die ID aus der Datentabelle aus, wobei id = dt.id-Reihenfolge nach version_id desc limit 1)




nicht getestet, aber so etwas könnte funktionieren:

SELECT * FROM Tabelle GROUP BY ID ORDER BY MAX (Versionskennung) DESC




Links