Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête mySQL - afficher l'élément le plus populaire

Ma suggestion initiale était incorrecte :

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;

Cela suppose à tort que l'agrégation externe (par date) sélectionnera la première ligne de la table dérivée interne qui a été triée par cnt. Ce comportement est, en fait, indéfini et il n'est pas garanti qu'il soit cohérent.

Voici la bonne solution :

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;

Remarque :

J'ai ajouté le (SELECT COUNT(*)) AS total parce que la question posée pour cela dans une requête. Cependant, cela ne sera pas mis à l'échelle car il s'agit d'une sous-requête corrélée. Cela signifie que pour chaque t1.date, la sous-requête SELECT COUNT(*) sera exécutée. Veuillez comparer et voir s'il fonctionne correctement pour vos besoins. Si ce n'est pas le cas, je suggère d'obtenir les totaux quotidiens dans une requête distincte. Vous fusionnerez ces résultats dans votre application.