Mysql
 sql >> Database >  >> RDS >> Mysql

query MySQL - mostra l'elemento più popolare

Il mio suggerimento iniziale era errato :

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;

Ciò presuppone erroneamente che l'aggregazione esterna (per data) selezionerà la prima riga della tabella derivata interna che è stata ordinata per cnt. Questo comportamento è, infatti, indefinito e non è garantito che sia coerente.

Ecco la soluzione corretta:

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:

Ho aggiunto il (SELECT COUNT(*)) AS total perché la domanda ha posto questo in una query. Tuttavia, questo non verrà ridimensionato in quanto è una sottoquery correlata. Ciò significa che per ogni t1.date verrà eseguita la sottoquery SELECT COUNT(*). Si prega di confrontare e vedere se si comporta in modo adeguato alle proprie esigenze. In caso contrario, suggerisco di ottenere i totali giornalieri in una query separata. Uniresti questi risultati nella tua applicazione.