Jeg løber ind i dette problem hele tiden. Når MySQL kører en aggregeret funktion, for alle ikke-aggregerede kolonner, trækker den simpelthen de første data, den løber over for den gruppe, uanset om det er fra MAX-rækken eller ej. Så det, du skal gøre, er at bestille dataene i en indre forespørgsel, således at maksimumerne er først i deres grupper. Se om dette virker for 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
;
Bemærk, at jeg ikke bruger nogen MAX-funktion her. Sortering efter faldende score og derefter gruppering efter dato i den ydre forespørgsel vil trække den højeste score efter dato. Bemærk også, at jeg sætter WHERE-sætningen i den indre forespørgsel. Indre forespørgsler som denne (som nogle gange er nødvendige) er ikke særlig effektive, da de ikke har nogen indekser for den ydre forespørgsel at optimere på, så sørg for, at dit indre resultatsæt er så lille, som det kan være. Læg endelig mærke til GRUPPER EFTER DATO(t.pubdate_utc). Hvis jeg ikke reducerede det til kun datooplysningerne, ville der være meget mere end 18 resultater, da tider også tælles med.
Rediger:Ændret til INTERVAL -17 DAY
at give op til 18 resultater i stedet for 19.