Я постоянно сталкиваюсь с этой проблемой.Когда 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