sql >> Databasteknik >  >> RDS >> Mysql

MySQL group by and max returnerar fel rader

Jag stöter på det här problemet hela tiden. När MySQL kör en aggregerad funktion, för alla icke aggregerade kolumner, hämtar den helt enkelt den första data som den körs över för den gruppen, oavsett om den är från MAX-raden eller inte. Så vad du behöver göra är att beställa data i en inre fråga så att maxvärdena är först i sina grupper. Se om detta fungerar för dig:

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
;

Observera att jag inte använder någon MAX-funktion här. Att sortera efter sjunkande poäng och sedan gruppera efter datum i den yttre frågan kommer att få upp det högsta betyget efter datum. Lägg också märke till att jag lägger in WHERE-satsen i den inre frågan. Inre frågor som denna (även ibland nödvändiga) är inte särskilt effektiva, eftersom de inte har några index för den yttre frågan att optimera på, så se till att din inre resultatuppsättning är så liten som den kan bli. Lägg till sist märke till GROUP BY DATE(t.pubdate_utc). Om jag inte minskade det till bara datuminformationen skulle det bli mycket mer än 18 resultat, eftersom tider också räknas då.

Redigera:Ändrade till INTERVAL -17 DAY för att ge upp till 18 resultat istället för 19.



  1. Yii Få MySql-frågan körd

  2. SQLite UTOM Operatör

  3. Laravel 5.1 - Ordna efter två kolumner som inte fungerar som avsett

  4. laravel databasanslutning returnerar odefinierat indexfel