sql >> Base de Datos >  >> RDS >> Mysql

MySQL group by y max devuelve filas incorrectas

Me encuentro con este problema todo el tiempo. Cuando MySQL ejecuta una función agregada, para cualquier columna no agregada, simplemente extrae los primeros datos que encuentra para ese grupo, ya sea de la fila MAX o no. Entonces, lo que tiene que hacer es ordenar los datos en una consulta interna de modo que los máximos sean los primeros en sus grupos. Vea si esto funciona para usted:

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
;

Tenga en cuenta que no uso la función MAX aquí. Ordenar por puntaje descendente y luego agrupar por fecha en la consulta externa arrojará el puntaje más alto por fecha. También observe que puse la cláusula WHERE en la consulta interna. Las consultas internas como esta (aunque a veces son necesarias) no son muy eficientes, ya que no tienen índices para optimizar la consulta externa, así que asegúrese de que su conjunto de resultados internos sea lo más pequeño posible. Por último, observe el GRUPO POR FECHA (t.pubdate_utc). Si no lo redujera solo a la información de la fecha, habría muchos más de 18 resultados, ya que entonces también se cuentan los tiempos.

Editar:Cambiado a INTERVAL -17 DAY para dar hasta 18 resultados en lugar de 19.