Quello di cui hai bisogno qui è una query SQL leggermente elaborata. Sarà composto da sottoquery.
Il primo è questo (violino ). Ti dà il numero totale di oggetti apriporta per ogni nome.
SELECT COUNT(*) total, name FROM stats GROUP BY name
Il prossimo è questo (violino ). Ti dà il numero di aperture per porta e nome.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
Il terzo (violino ) incorpora il secondo e ti dà una riga per ogni nome, mostrando le porte che si aprono.
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
Infine, hai bisogno di un JOIN per collegare insieme quelle sottoquery, di questo modulo.
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
Tutto spiegato sembra così (violino
). Lo metti nel tuo sql
variabile e sei a posto. È solo una stringa multilinea.
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}
Quindi c'è una query composta da un mucchio di query nidificate.
Ci sono alcuni trucchi da imparare per migliorare l'analisi dei dati SQL.
- uso di
GROUP BY
- nidificazione delle query, nota anche come sottoquery. Puoi pensare alle sottoquery come a tabelle virtuali.
- (avanzato)
GROUP_CONCAT
.