Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL group by e max retorna linhas erradas


Eu me deparo com esse problema o tempo todo. Quando o MySQL executa uma função agregada, para qualquer coluna não agregada, ele simplesmente extrai os primeiros dados que executa para esse grupo, seja da linha MAX ou não. Então, o que você precisa fazer é ordenar os dados em uma consulta interna de forma que os máximos sejam os primeiros em seus grupos. Veja se isso funciona para você:
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
;

Observe que não uso nenhuma função MAX aqui. Ordenar por pontuação decrescente e, em seguida, agrupar por data na consulta externa exibirá a pontuação mais alta por data. Observe também que coloquei a cláusula WHERE na consulta interna. Consultas internas como essa (embora às vezes necessárias) não são muito eficientes, pois não têm índices para a consulta externa otimizar, portanto, certifique-se de que seu conjunto de resultados interno seja o menor possível. Por último, observe o GROUP BY DATE(t.pubdate_utc). Se eu não reduzisse apenas para as informações de data, haveria muito mais do que 18 resultados, pois os tempos também são contados.

Editar:alterado para INTERVAL -17 DAY para dar até 18 resultados em vez de 19.