sql >> Base de Datos >  >> RDS >> Mysql

MySQL SELECT más frecuente por grupo

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;

Estoy de acuerdo en que esto es demasiado para una sola consulta SQL. Cualquier uso de GROUP BY dentro de una subconsulta me hace estremecer. Puedes hacer que se vea más simple usando vistas:

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;

Pero básicamente está haciendo el mismo trabajo entre bastidores.

Comentas que podrías hacer una operación similar fácilmente en el código de la aplicación. Entonces, ¿por qué no haces eso? Realice la consulta más sencilla para obtener los recuentos por categoría:

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

Y ordene el resultado en el código de la aplicación.