Cały czas napotykam ten problem. Gdy MySQL uruchamia funkcję agregującą dla dowolnych kolumn niezagregowanych, po prostu pobiera pierwsze dane, które napotka dla tej grupy, niezależnie od tego, czy pochodzą one z wiersza MAX, czy nie. Musisz więc uporządkować dane w wewnętrznym zapytaniu tak, aby maksymy były pierwsze w swoich grupach. Sprawdź, czy to działa dla Ciebie:
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
;
Zauważ, że nie używam tutaj funkcji MAX. Porządkowanie według wyniku malejąco, a następnie grupowanie według daty w zewnętrznym zapytaniu spowoduje wyświetlenie najwyższego wyniku według daty. Zauważ też, że w zapytaniu wewnętrznym umieściłem klauzulę WHERE. Zapytania wewnętrzne, takie jak to (choć czasami konieczne) nie są zbyt wydajne, ponieważ nie mają indeksów, na których można by zoptymalizować zapytanie zewnętrzne, więc upewnij się, że Twój wewnętrzny zestaw wyników jest tak mały, jak to tylko możliwe. Na koniec zwróć uwagę na GRUPA WEDŁUG DATY (t.pubdate_utc). Gdybym nie skrócił go tylko do informacji o dacie, byłoby znacznie więcej niż 18 wyników, ponieważ wtedy liczone są również czasy.
Edycja:zmieniono na INTERVAL -17 DAY
dać do 18 wyników zamiast 19.