Ponieważ kraje mogą mieć wiele stanów, a każdy stan może mieć wiele miast, gdy dołączysz do tych od 1 do wielu i od 1 do wielu, liczba stanów jest zawyżona. Potrzebujesz więc odrębnej liczby stanów. Liczba miast jest już unikalna dla kraju i stanu, dlatego nie jest potrzebna odrębność. gdzie jako państwo nie jest unikalne dla miasta wiejskiego, dlatego potrzebne jest odrębne. To oczywiście zakłada, że chcesz mieć liczbę unikalnych stanów w każdym kraju.
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
Lub zachowując notację sprzężenia w starym stylu:
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
Rozważmy następujący przykład:http://rextester.com/ZGYF56786
lub obrazowo poniżej
Zobacz, kiedy występują połączenia między krajem, stanem i miastem. stan jest powtarzany z powodu przyłączenia do miasta, przez co stan nie jest już unikalny w tej kolumnie, wykonując odrębne zwracamy tylko liczbę 2 stanów zamiast 7, po jednym dla każdego rekordu.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Myślę, że chcesz pierwszego wyniku, ponieważ w tabeli USA są tylko 2 stany i 7 miast.