Wat je hier nodig hebt, is een enigszins uitgebreide SQL-query. Het zal bestaan uit subquery's.
De eerste is deze (fiddle ). Het geeft je het totale aantal deur-open items voor elke naam.
SELECT COUNT(*) total, name FROM stats GROUP BY name
De volgende is deze (fiddle ). Het geeft je het aantal openingen per deur en naam.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
De derde (fiddle ) bevat de tweede en geeft je één regel voor elke naam, met de deur-open.
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
Ten slotte heb je een JOIN nodig om die subquery's van deze vorm aan elkaar te koppelen.
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
Alles gespeld ziet het er zo uit (fiddle
). Je zet het in je sql
variabel en je bent klaar om te gaan. Het is gewoon een reeks met meerdere regels.
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}
Er is dus een zoekopdracht gemaakt van een aantal geneste zoekopdrachten.
Er zijn hier enkele trucs die u kunt leren naarmate u beter wordt in SQL-gegevensanalyse.
- gebruik van
GROUP BY
- query nesten, ook wel subquery's genoemd. U kunt subquery's zien als virtuele tabellen.
- (geavanceerd)
GROUP_CONCAT
.