私はいつもこの問題に遭遇します。 MySQLが集計関数を実行すると、集計されていない列に対して、MAX行からのものであるかどうかに関係なく、そのグループで最初に実行されたデータをプルするだけです。したがって、あなたがしなければならないことは、最大値がそれらのグループの最初になるように、内部クエリのデータを並べ替えることです。これがうまくいくかどうかを確認してください:
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
;
ここではMAX関数を使用していないことに注意してください。スコアの降順で並べ替えてから、外部クエリで日付でグループ化すると、日付で最高のスコアが表示されます。また、内部クエリにWHERE句を配置していることにも注意してください。このような内部クエリ(場合によっては必要)は、最適化する外部クエリのインデックスがないため、あまり効率的ではありません。したがって、内部結果セットをできるだけ小さくしてください。最後に、GROUP BY DATE(t.pubdate_utc)に注目してください。日付情報だけに絞り込まないと、時間もカウントされるため、18を超える結果が得られます。
編集:INTERVAL -17 DAY
に変更 19ではなく最大18の結果を提供します。