Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL group by et max renvoie les mauvaises lignes

Je rencontre ce problème tout le temps. Lorsque MySQL exécute une fonction d'agrégation, pour toutes les colonnes non agrégées, il extrait simplement les premières données qu'il exécute pour ce groupe, qu'elles proviennent de la ligne MAX ou non. Donc, ce que vous avez à faire est de classer les données dans une requête interne de sorte que les maximums soient les premiers dans leurs groupes. Voyez si cela fonctionne pour vous :

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
;

Notez que je n'utilise pas de fonction MAX ici. Le classement par score décroissant, puis le regroupement par date dans la requête externe affichera le score le plus élevé par date. Notez également que j'ai mis la clause WHERE dans la requête interne. Les requêtes internes comme celle-ci (bien que parfois nécessaires) ne sont pas très efficaces, car elles n'ont pas d'index pour la requête externe à optimiser, alors assurez-vous que votre jeu de résultats interne est aussi petit que possible. Enfin, notez le GROUP BY DATE(t.pubdate_utc). Si je ne le réduisais pas aux seules informations de date, il y aurait bien plus de 18 résultats, car les temps sont également comptés à ce moment-là.

Modifier :remplacé par INTERVAL -17 DAY pour donner jusqu'à 18 résultats au lieu de 19.