Da Länder mehrere Staaten haben können und jeder Staat mehrere Städte haben kann, wenn Sie diese 1 zu vielen und 1 zu vielen vielen verbinden, ist Ihre Anzahl an Staaten überhöht. Sie benötigen also die eindeutige Anzahl von Zuständen. Die Anzahl der Städte ist bereits eindeutig für Land und Staat und benötigt daher keine Unterscheidung. wobei ein Staat nicht nur für eine Stadt auf dem Land gilt, daher ist eine Unterscheidung erforderlich. Dies setzt natürlich voraus, dass Sie die Anzahl der eindeutigen Staaten in jedem Land wünschen.
SELECT c.name, count(distinct s.name) as statecount, count(Ci.name) as CityCount
FROM countries c
INNER JOIN states s
on c.id = s.country_ID
INNER JOIN cities ci
ON s.id = ci.state_id
GROUP BY C.name
Oder behalten Sie Ihre alte Join-Notation bei:
SELECT c.name, count(distinct s.name) as statecount, count(ci.name) citycount
FROM countries c,states s,cities ci
WHERE ci.state_id = s.id
and s.country_id = c.id
GROUP BY s.name
Betrachten Sie das folgende Beispiel:http://rextester.com/ZGYF56786
oder bildlich unten
Sehen Sie, wann die Verknüpfungen zwischen Land, Staat und Stadt stattfinden. Zustand wird wegen der Verknüpfung mit Stadt wiederholt, wodurch der Zustand in dieser Spalte nicht mehr eindeutig ist. Durch eine Unterscheidung geben wir nur eine Anzahl von 2 Staaten statt 7 zurück, einen für jeden Datensatz.
+-----+------------+-------------+
| USA | Illinois | Chicago |
| USA | Illinois | Springfield |
| USA | Illinois | Peoria |
| USA | California | LosAngeles |
| USA | California | Sacramento |
| USA | California | SanDeigo |
| USA | California | Hollywood |
| USA | California | Oakland |
|-----|------------|-------------|
|Name | statecount | Citycount |
| USA | 2 | 7 | <-- Is this result correct? (i hope so)
| USA | 7 | 7 | <-- or this one? (then why bother just count(*) and only 1 count needed.
+-----+------------+-------------+
Ich denke, Sie möchten das erste Ergebnis, da in der USA-Tabelle nur 2 Bundesstaaten und 7 Städte aufgeführt sind.