Como os países podem ter vários estados e cada estado pode ter várias cidades quando você junta esses 1 para muitos e 1 para muitos, sua contagem de estados é inflada. Então você precisa da contagem distinta de estado. A contagem de cidades já é exclusiva para país e estado, portanto, não precisa do distinto. onde, como o estado não é exclusivo da cidade do país, é necessário distinguir. Obviamente, isso pressupõe que você deseja a contagem de estados exclusivos em cada país.
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
Ou mantendo sua notação de junção de estilo antigo:
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
Considere o seguinte exemplo:http://rextester.com/ZGYF56786
ou pictoricamente abaixo
Veja quando ocorrem as junções entre país, estado e cidade. state se repete por causa do join to city, tornando state não mais único nessa coluna, fazendo um distinct só retornamos uma contagem de 2 estados ao invés de 7, um para cada registro.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Eu acho que você quer o 1º resultado, já que existem apenas 2 estados na tabela dos EUA listados e 7 cidades.