Poiché i paesi possono avere più stati e ogni stato può avere più città quando ti unisci a questi da 1 a molti e da 1 a molti molti, il conteggio degli stati viene gonfiato. Quindi hai bisogno del distinto conteggio di stato. Il conteggio delle città è già unico per paese e stato, quindi non ha bisogno del distinto. dove poiché lo stato non è unico per la città di campagna, è necessario quindi distinto. Questo ovviamente presuppone che tu voglia il conteggio degli stati unici in ogni paese.
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
O mantenendo la notazione di join vecchio stile:
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
Considera il seguente esempio:http://rextester.com/ZGYF56786
o pittoricamente sotto
Guarda quando si verificano i join tra paese, stato e città. lo stato viene ripetuto a causa dell'unione alla città, rendendo lo stato non più unico in quella colonna, facendo una distinta restituiamo solo un conteggio di 2 stati invece di 7, uno per ogni record.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Penso che tu voglia il primo risultato poiché ci sono solo 2 stati nella tabella USA elencata e 7 città.