sql >> Databáze >  >> RDS >> Mysql

mySQL dotaz - zobrazí nejoblíbenější položku

Můj původní návrh byl nesprávný :

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;

To chybně předpokládá, že vnější agregace (podle data) vybere první řádek vnitřní odvozené tabulky, který byl uspořádán podle cnt. Toto chování je ve skutečnosti nedefinované a není zaručeno, že bude konzistentní.

Zde je správné řešení:

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;

Poznámka:

Přidal jsem (SELECT COUNT(*)) AS total protože otázka to vyžadovala v jednom dotazu. Toto však nebude škálovat, protože se jedná o korelovaný poddotaz. To znamená, že pro každý t1.date bude spuštěn poddotaz SELECT COUNT(*). Proveďte srovnání a zjistěte, zda funguje vhodně pro vaše potřeby. Pokud ne, doporučuji získat denní součty v samostatném dotazu. Tyto výsledky byste sloučili ve své aplikaci.



  1. Jak najít aktuální otevřené kurzory v Oracle

  2. Rozdíl v MySQL JOIN a LEFT JOIN

  3. Jak převést HLAVNÍ databázi mysql na InnoDB z MyIsam

  4. Jak zkontrolovat duplikáty v tabulce mysql ve více sloupcích