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

MySQL group by und max gibt falsche Zeilen zurück

Ich stoße die ganze Zeit auf dieses Problem. Wenn MySQL eine Aggregatfunktion für alle nicht aggregierten Spalten ausführt, zieht es einfach die ersten Daten, die es für diese Gruppe durchläuft, unabhängig davon, ob sie aus der MAX-Zeile stammen oder nicht. Was Sie also tun müssen, ist, die Daten in einer inneren Abfrage so zu ordnen, dass die Maximalwerte in ihren Gruppen an erster Stelle stehen. Sehen Sie, ob dies für Sie funktioniert:

SELECT t.post_id,
       t.profile_id,
       t.score,
       t.pubdate_utc
FROM (SELECT p.profile_id,
             p.post_id,
             p.pubdate_utc,
             (pp.comments + pp.likes + pp.favorites) score
      FROM posts p
      JOIN posts_points pp ON p.post_id = pp.post_id
      WHERE p.pubdate_utc >= DATE_ADD(DATE(NOW()), INTERVAL -17 DAY)
      ORDER BY score DESC
     ) t
GROUP BY DATE(t.pubdate_utc) DESC
;

Beachten Sie, dass ich hier keine MAX-Funktion verwende. Sortieren nach Punktzahl absteigend und dann Gruppieren nach Datum in der äußeren Abfrage wird die höchste Punktzahl nach Datum abrufen. Beachten Sie auch, dass ich die WHERE-Klausel in die innere Abfrage eingefügt habe. Innere Abfragen wie diese (obwohl manchmal notwendig) sind nicht sehr effizient, da sie keine Indizes für die äußere Abfrage haben, auf denen sie optimiert werden können. Stellen Sie also sicher, dass Ihre innere Ergebnismenge so klein wie möglich ist. Beachten Sie schließlich das GROUP BY DATE (t.pubdate_utc). Wenn ich es nicht auf die Datumsangabe reduzieren würde, wären es weit mehr als 18 Ergebnisse, da dann auch Zeiten gezählt werden.

Bearbeiten:Geändert in INTERVAL -17 DAY statt 19 bis zu 18 Ergebnisse zu geben.