sql >> Databasteknik >  >> RDS >> Mysql

mySQL-fråga - visa det populäraste föremålet

Mitt första förslag var felaktigt :

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;

Detta förutsätter felaktigt att den yttre aggregeringen (efter datum) kommer att välja den första raden i den inre härledda tabellen som sorterades av cnt. Detta beteende är i själva verket odefinierat och inte garanterat konsekvent.

Här är den rätta lösningen:

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;

Obs!

Jag lade till (SELECT COUNT(*)) AS total eftersom frågan bad om detta i en fråga. Detta kommer dock inte att skalas eftersom det är en korrelerad underfråga. Detta betyder att för varje t1.date kommer underfrågan SELECT COUNT(*) att köras. Vänligen benchmarkera och se om den fungerar för dina behov. Om inte, föreslår jag att du får de dagliga summorna i en separat fråga. Du skulle slå samman dessa resultat i din ansökan.



  1. MySQL - Hur kastar man undantag i lagrad procedur?

  2. VAR kontra HA

  3. Letar efter motsvarigheten till dictcursor i flaskext.mysql

  4. Varför använda MySQL över flatfiler?