Сблъсквам се с този проблем през цялото време. Когато 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
за да дадете до 18 резултата вместо 19.