Saya mengalami masalah ini sepanjang waktu. Ketika MySQL menjalankan fungsi agregat, untuk kolom non-agregat apa pun, itu hanya menarik data pertama yang dijalankannya untuk grup itu, apakah itu dari baris MAX atau tidak. Jadi yang harus Anda lakukan adalah mengurutkan data dalam kueri dalam sehingga maks berada di urutan pertama dalam grupnya. Lihat apakah ini berhasil untuk Anda:
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
;
Perhatikan bahwa saya tidak menggunakan fungsi MAX di sini. Mengurutkan berdasarkan skor turun dan kemudian mengelompokkan berdasarkan tanggal di kueri luar akan menarik skor tertinggi berdasarkan tanggal. Perhatikan juga bahwa saya meletakkan klausa WHERE di kueri dalam. Kueri dalam seperti ini (kadang-kadang diperlukan) tidak terlalu efisien, karena tidak memiliki indeks untuk kueri luar untuk dioptimalkan, jadi pastikan set hasil dalam Anda sekecil mungkin. Terakhir, perhatikan GROUP BY DATE(t.pubdate_utc). Jika saya tidak menguranginya menjadi hanya informasi tanggal, akan ada lebih dari 18 hasil, karena waktu juga dihitung.
Sunting:Diubah menjadi INTERVAL -17 DAY
untuk memberikan hingga 18 hasil, bukan 19.