O que você precisa aqui é uma consulta SQL um pouco elaborada. Ela será composta de subconsultas.
O primeiro é este (violino ). Dá-lhe o número total de itens de porta aberta para cada nome.
SELECT COUNT(*) total, name FROM stats GROUP BY name
O próximo é este (violino ). Dá-lhe o número de aberturas por porta e nome.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
O terceiro (violino ) incorpora o segundo e fornece uma linha para cada nome, mostrando as portas abertas.
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, você precisa de um JOIN para unir essas subconsultas, neste formulário.
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
Tudo escrito parece com isso (fiddle ). Você coloca em seu
sql
variável e você está pronto para ir. É apenas uma string de várias linhas. 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}
Portanto, há uma consulta feita de várias consultas aninhadas.
Existem alguns truques aqui para você aprender à medida que se aprimora na análise de dados SQL.
- uso de
GROUP BY
- aninhamento de consultas, também conhecido como subconsultas. Você pode pensar em subconsultas como tabelas virtuais.
- (avançado)
GROUP_CONCAT
.