Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL SELECT le plus fréquent par groupe

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;

Je suis d'accord que c'est un peu trop pour une seule requête SQL. Toute utilisation de GROUP BY à l'intérieur d'une sous-requête me fait grimacer. Vous pouvez le faire regarder plus simple en utilisant les vues :

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;

Mais il fait fondamentalement le même travail dans les coulisses.

Vous commentez que vous pourriez facilement effectuer une opération similaire dans le code de l'application. Alors pourquoi ne fais-tu pas ça ? Effectuez la requête la plus simple pour obtenir le nombre par catégorie :

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

Et triez le résultat dans le code de l'application.