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

consulta mySQL:muestra el elemento más popular

Mi sugerencia inicial fue incorrecta :

SELECT
  date, item, SUM(cnt)
FROM (
  SELECT
    date, item, count(item_id) AS cnt
  FROM test_popularity
  GROUP BY date, item_id
  ORDER BY cnt DESC
) t
GROUP BY date;

Esto supone erróneamente que la agregación externa (por fecha) seleccionará la primera fila de la tabla derivada interna que se ordenó por cnt. Este comportamiento es, de hecho, indefinido y no se garantiza que sea consistente.

Aquí está la solución adecuada:

SELECT
  t1.date, t1.item, 
  (SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
  # see note!
FROM test_popularity t1
JOIN (
  SELECT date, item, item_id, COUNT(item_id) as count
  FROM test_popularity
  GROUP BY date, item_id
) AS t2
ON t1.date = t2.date AND t1.item_id = t2.item_id
GROUP BY t1.date;

Nota:

Agregué el (SELECT COUNT(*)) AS total porque la pregunta pedía esto en una consulta. Sin embargo, esto no escalará ya que es una subconsulta correlacionada. Esto significa que para cada t1.date se ejecutará la subconsulta SELECT COUNT(*). Por favor, compare y vea si funciona adecuadamente para sus necesidades. De lo contrario, sugiero obtener los totales diarios en una consulta separada. Combinaría estos resultados en su aplicación.