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

MySQL SELECT nejčastější podle skupiny

SELECT t1.*
FROM (SELECT tag, category, COUNT(*) AS count
      FROM tags INNER JOIN stuff USING (id)
      GROUP BY tag, category) t1
LEFT OUTER JOIN 
     (SELECT tag, category, COUNT(*) AS count
      FROM tags INNER JOIN stuff USING (id)
      GROUP BY tag, category) t2
  ON (t1.tag = t2.tag AND (t1.count < t2.count 
      OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;

Souhlasím, že je toho na jeden SQL dotaz příliš mnoho. Jakékoli použití GROUP BY uvnitř dílčího dotazu mě trhne. Můžete to vytvořit jednodušší pomocí zobrazení:

CREATE VIEW count_per_category AS
    SELECT tag, category, COUNT(*) AS count
    FROM tags INNER JOIN stuff USING (id)
    GROUP BY tag, category;

SELECT t1.*
FROM count_per_category t1
LEFT OUTER JOIN count_per_category t2
  ON (t1.tag = t2.tag AND (t1.count < t2.count 
      OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;

Ale v podstatě dělá stejnou práci v zákulisí.

Komentujete, že byste podobnou operaci mohli snadno provést v kódu aplikace. Tak proč to neuděláš? Chcete-li získat počty podle kategorie, proveďte jednodušší dotaz:

SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;

A seřadit výsledek v kódu aplikace.



  1. Seskupování záznamů ze smyčky while | PHP

  2. Jak stáhnu soubor pomocí PHP a Mysql DB

  3. ODP.NET Oracle.ManagedDataAcess náhodné chyby ORA-12570

  4. Neznámý sloupec v seznamu polí