Eftersom länder kan ha flera stater och varje stat kan ha flera städer när du går med i dessa 1 till många och 1 till många många är ditt delstatsantal uppblåst. Så du behöver den distinkta räkningen av staten. Stadsräkningen är redan unik för land och stat, och behöver därför inte den distinkta. där staten inte är unik för landet stad, så distinkt behövs. Detta förutsätter naturligtvis att du vill ha antalet unika stater i varje land.
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
Eller behåll din gamla anslutningsnotation:
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
Tänk på följande exempel:http://rextester.com/ZGYF56786
eller bildmässigt nedan
Se när kopplingarna sker mellan land, stat och stad. staten upprepas på grund av kopplingen till staden, vilket gör att staten inte längre är unik i den kolumnen, genom att göra en distinkt returnerar vi bara ett antal av 2 stater istället för 7, en för varje post.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Jag skulle tro att du vill ha det första resultatet eftersom det bara finns 2 delstater i USA-tabellen och 7 städer.