Тъй като държавите могат да имат множество щати и всеки щат може да има множество градове, когато се присъедините към тези 1 към много и 1 към много много, вашият брой щати се увеличава. Така че имате нужда от различен брой на състоянието. Броят на градовете вече е уникален за страната и щата, поради което не се нуждае от разграничение. където тъй като държавата не е уникална за селския град, следователно е необходима различна. Това разбира се предполага, че искате броя на уникалните щати във всяка страна.
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
Или запазване на стария ви стил на нотация за присъединяване:
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
Разгледайте следния пример:http://rextester.com/ZGYF56786
или илюстрирано по-долу
Вижте кога стават присъединявания между държава, щат и град. състоянието се повтаря поради присъединяването към града, което прави състоянието вече неуникално в тази колона, като правим отделно, връщаме само брой от 2 състояния вместо 7, по един за всеки запис.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Мисля, че искате първия резултат, тъй като в таблицата на САЩ има само 2 изброени щата и 7 града.