sql >> Database >  >> RDS >> Mysql

mySQL-query - meest populaire item weergeven

Mijn eerste suggestie was onjuist :

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;

Dit veronderstelt ten onrechte dat de buitenste aggregatie (op datum) de eerste rij van de binnenste afgeleide tabel selecteert die is geordend op cnt. Dit gedrag is in feite ongedefinieerd en niet gegarandeerd consistent.

Hier is de juiste oplossing:

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;

Opmerking:

Ik heb de (SELECT COUNT(*)) AS total . toegevoegd omdat de vraag hier in één query om vroeg. Dit wordt echter niet geschaald omdat het een gecorreleerde subquery is. Dit betekent dat voor elke t1.date de subquery SELECT COUNT(*) wordt uitgevoerd. Gelieve te benchmarken en te zien of het geschikt is voor uw behoeften. Zo niet, dan raad ik aan om de dagelijkse totalen in een aparte query te krijgen. U zou deze resultaten samenvoegen in uw aanvraag.



  1. een limiet van het aantal SQL Server-verbindingen?

  2. Waarom stopt mijn cfloop na het invoegen van de eerste id?

  3. Kan ik een UNIQUE-beperking aan een PostgreSQL-tabel toevoegen nadat deze al is gemaakt?

  4. Kan waarde '2012-04-05 10:20:00' niet converteren van kolom XX naar TIMESTAMP