Mysql
 sql >> Datenbank >  >> RDS >> Mysql

ORDER BY Unterabfrage für die Umwandlung von GROUP BY in JOIN

Dies kann wie folgt vereinfacht werden (der ORDER BY in der Unterabfrage ist nutzlos):

SELECT * 
FROM table
GROUP BY title

Warum denkst du, dass du JOIN brauchst ? (Ok, das wurde durch Kommentare gelöst).

Nach Ihrem Kommentar, den Sie für jeden Titel benötigen, die Zeile mit dem größten Zeitstempel, würde dies die Arbeit erledigen:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

Fürs Protokoll, Ihre ursprüngliche Anfrage:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

vielleicht funktionieren wie erwartet, aber:nur in MySQL, die Sie in SELECT verwenden können listet Felder auf, die nicht in GROUP BY enthalten sind -Klausel (oder hängen von diesen ab), ohne dass Aggregatfunktionen darin enthalten sind. Die obige Abfrage gibt also einen mehr oder weniger zufälligen Wert zurück Zeile für jeden Titel. Tatsächlich gibt es die erste Zeile zurück, die es für einen Titel findet. Nachdem Sie also zuerst die Unterabfrage ausgeführt haben (die nach timestamp DESC ordnet ) führt dazu, dass zuerst die Zeile mit dem größten Zeitstempel gefunden wird.

Dies geschieht jedoch nur, weil (wenn, wenn) der Optimierer nicht versteht, dass die Unterabfrage nutzlos ist. Möglicherweise stellen Sie fest, dass Ihre ursprüngliche Abfrage problemlos ausgeführt wird, wenn Sie eines Tages auf MySQL-Version 7.5 aktualisieren und Ihre Abfrage nicht mehr wie zuvor funktioniert. (weil der Optimierer cleverer geworden ist und Ihre Abfrage in eine einfachere ohne Unterauswahl übersetzt hat).

Sie können sogar feststellen, dass Ihre Abfrage nicht mehr funktioniert und einen Fehler erzeugt, wenn MySQL in einer zukünftigen Version beschließt, sich an die SQL-Standards für GROUP BY zu halten Abfragen.