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

MySQL SELECT hyppigst efter gruppe

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;

Jeg er enig i, at dette er lidt for meget for en enkelt SQL-forespørgsel. Enhver brug af GROUP BY inde i en underforespørgsel får mig til at ryste. Du kan få det til at se ud enklere ved at bruge visninger:

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;

Men det er i bund og grund det samme arbejde bag kulisserne.

Du kommenterer, at du nemt kunne udføre en lignende handling i applikationskoden. Så hvorfor gør du ikke det? Foretag den simplere forespørgsel for at få tællingerne pr. kategori:

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

Og sorter resultatet i applikationskoden.



  1. JSON_QUOTE() – Sådan undslipper du tegn i strenge, der bruges som JSON-værdier i MySQL

  2. Sådan udføres funktion i Oracle med parametre

  3. Bedste måde at gemme IP i databasen?

  4. Kører flere SQL-sætninger fra Groovy