Lo que necesita aquí es una consulta SQL ligeramente elaborada. Estará compuesto por subconsultas.
El primero es este (fiddle ). Obtiene el número total de artículos abiertos para cada nombre.
SELECT COUNT(*) total, name FROM stats GROUP BY name
El siguiente es este (fiddle ). Te da el número de aperturas por puerta y nombre.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
El tercero (fiddle ) incorpora el segundo y obtiene una línea para cada nombre, mostrando la puerta que se abre.
SELECT name,
GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
FROM ( SELECT COUNT(*) bydoor,
name,
door
FROM stats
GROUP BY name, door
) s
GROUP BY name
Finalmente, necesita un JOIN para unir esas subconsultas, de esta forma.
SELECT t.name, t.total, d.details
FROM ( .... the first subquery ....) t
JOIN ( .... the second subquery .... ) d ON t.name = d.name
ORDER BY t.total DESC, t.name
Todo explicado se ve así (fiddle
). Lo pones en tu sql
variable y listo. Es solo una cadena de varias líneas.
set sql {SELECT t.name, t.total, d.details
FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
JOIN ( SELECT name,
GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
FROM ( SELECT COUNT(*) bydoor,
name,
door
FROM stats
GROUP BY name, door
) s
GROUP BY name
) d ON t.name = d.name
ORDER BY t.total DESC, t.name}
Así que hay una consulta hecha de un montón de consultas anidadas.
Aquí hay algunos trucos que puede aprender a medida que mejora en el análisis de datos SQL.
- uso de
GROUP BY
- Anidamiento de consultas, también conocido como subconsultas. Puede pensar en las subconsultas como tablas virtuales.
- (avanzado)
GROUP_CONCAT
.