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

consulta mySQL - mostra o item mais popular


Minha sugestão inicial estava incorreta :
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;

Isso assume erroneamente que a agregação externa (por data) selecionará a primeira linha da tabela derivada interna que foi ordenada por cnt. Esse comportamento é, de fato, indefinido e não há garantia de consistência.

Aqui está a solução adequada:
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;

Observação:

Adicionei o (SELECT COUNT(*)) AS total porque a pergunta pediu isso em uma consulta. No entanto, isso não será dimensionado, pois é uma subconsulta correlacionada. Isso significa que para cada t1.date a subconsulta SELECT COUNT(*) será executada. Por favor, faça um benchmark e veja se ele funciona adequadamente para suas necessidades. Caso contrário, sugiro obter os totais diários em uma consulta separada. Você mesclaria esses resultados em seu aplicativo.