Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mySQL-Abfrage - beliebteste Artikel anzeigen

Mein ursprünglicher Vorschlag war falsch :

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;

Dies geht fälschlicherweise davon aus, dass die äußere Aggregation (nach Datum) die erste Zeile der inneren abgeleiteten Tabelle auswählt, die nach cnt geordnet wurde. Dieses Verhalten ist tatsächlich undefiniert und es ist nicht garantiert, dass es konsistent ist.

Hier ist die richtige Lösung:

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;

Hinweis:

Ich habe den (SELECT COUNT(*)) AS total hinzugefügt weil die Frage in einer Abfrage danach gefragt hat. Dies wird jedoch nicht skaliert, da es sich um eine korrelierte Unterabfrage handelt. Das bedeutet, dass für jedes t1.date die Unterabfrage SELECT COUNT(*) ausgeführt wird. Bitte vergleichen Sie und sehen Sie, ob es für Ihre Bedürfnisse geeignet ist. Wenn nicht, dann schlage ich vor, die Tagessummen in einer separaten Abfrage abzurufen. Sie würden diese Ergebnisse in Ihrer Anwendung zusammenführen.