Potrzebujesz tutaj nieco rozbudowanego zapytania SQL. Będzie się składał z podzapytań.
Pierwszy z nich to (fiddle ). Daje Ci całkowitą liczbę przedmiotów do otwarcia drzwi dla każdego nazwiska.
SELECT COUNT(*) total, name FROM stats GROUP BY name
Następny jest ten (fiddle ). Daje Ci liczbę otwarć na drzwi i nazwę.
SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
Trzeci (skrzypce ) zawiera drugi i otrzymuje jedną linię dla każdego nazwiska, pokazując, jak otwierają się drzwi.
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
Na koniec potrzebujesz JOIN, aby powiązać te podzapytania w tej formie.
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
Wszystko napisane, wygląda tak (fiddle
). Umieszczasz go w swoim sql
zmienna i możesz iść. To tylko wielowierszowy ciąg.
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}
Więc jest zapytanie złożone z wielu zagnieżdżonych zapytań.
Jest tu kilka sztuczek, których możesz się nauczyć, gdy staniesz się lepszy w analizie danych SQL.
- użycie
GROUP BY
- zagnieżdżanie zapytań, zwane też podzapytaniami. Możesz myśleć o podzapytaniach jak o wirtualnych tabelach.
- (zaawansowane)
GROUP_CONCAT
.