S tímto problémem se setkávám neustále. Když MySQL spustí agregační funkci, pro všechny neagregované sloupce jednoduše stáhne první data, která pro danou skupinu spustí, ať už jsou z řádku MAX nebo ne. Takže co musíte udělat, je seřadit data ve vnitřním dotazu tak, aby maxima byla první ve svých skupinách. Podívejte se, jestli vám to funguje:
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
;
Všimněte si, že zde nepoužívám žádnou funkci MAX. Seřazení podle skóre sestupně a poté seskupení podle data ve vnějším dotazu vyvolá nejvyšší skóre podle data. Všimněte si také, že jsem do vnitřního dotazu vložil klauzuli WHERE. Vnitřní dotazy, jako je tento (které jsou někdy nutné), nejsou příliš efektivní, protože nemají žádné indexy pro vnější dotaz, které by bylo možné optimalizovat, takže se ujistěte, že vaše vnitřní sada výsledků je tak malá, jak jen může být. Nakonec si všimněte GROUP BY DATE(t.pubdate_utc). Kdybych to nezredukoval jen na informaci o datu, bylo by mnohem více než 18 výsledků, protože se pak počítají i časy.
Edit:Změněno na INTERVAL -17 DAY
dát až 18 výsledků místo 19.