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

mySQL-forespørgsel - vis mest populære emne

Mit oprindelige forslag var forkert :

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;

Dette antager fejlagtigt, at den ydre aggregering (efter dato) vil vælge den første række i den indre afledte tabel, som blev sorteret efter cnt. Denne adfærd er faktisk udefineret og er ikke garanteret konsekvent.

Her er den rigtige løsning:

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;

Bemærk:

Jeg tilføjede (SELECT COUNT(*)) AS total fordi spørgsmålet bad om dette i én forespørgsel. Dette vil dog ikke skaleres, da det er en korreleret underforespørgsel. Dette betyder, at for hver t1.date vil SELECT COUNT(*) underforespørgslen køre. Benchmark og se, om den fungerer passende til dine behov. Hvis ikke, så foreslår jeg at få de daglige totaler i en separat forespørgsel. Du vil flette disse resultater i din ansøgning.



  1. Konverter 'smalldatetime' til 'datetime2' i SQL Server (T-SQL-eksempler)

  2. Oracle (+) operatør

  3. MySQL opdaterer specifikke JSON-objekter i et array

  4. Django-modeller:standardværdi for kolonne