Ce dont vous avez besoin ici est une requête SQL légèrement élaborée. Elle sera composée de sous-requêtes.
Le premier est celui-ci (violon ). Il vous donne le nombre total d'éléments à porte ouverte pour chaque nom.
SELECT COUNT(*) total, name FROM stats GROUP BY name
Le suivant est celui-ci (violon ). Il vous donne le nombre d'ouvertures par porte et par nom.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
Le troisième (violon ) incorpore le second, et vous donne une ligne pour chaque nom, montrant la porte qui s'ouvre.
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
Enfin, vous avez besoin d'un JOIN pour lier ces sous-requêtes ensemble, de cette forme.
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
Tout cela ressemble à ceci (violon
). Vous le mettez dans votre sql
variable et vous êtes prêt à partir. C'est juste une chaîne multiligne.
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}
Il y a donc une requête composée d'un tas de requêtes imbriquées.
Il y a quelques astuces ici que vous apprendrez à mesure que vous vous améliorerez dans l'analyse de données SQL.
- utilisation de
GROUP BY
- imbrication de requêtes, également appelées sous-requêtes. Vous pouvez considérer les sous-requêtes comme des tables virtuelles.
- (avancé)
GROUP_CONCAT
.