Karena negara dapat memiliki beberapa negara bagian dan setiap negara bagian dapat memiliki beberapa kota saat Anda menggabungkan 1 ke banyak dan 1 ke banyak jumlah negara bagian Anda meningkat. Jadi, Anda membutuhkan jumlah negara yang berbeda. Jumlah kota sudah unik untuk negara dan negara bagian, sehingga tidak perlu dibedakan. sedangkan negara bagian tidak unik untuk kota pedesaan, maka diperlukan pembedaan. Ini tentu saja mengasumsikan Anda menginginkan jumlah negara bagian unik di setiap negara.
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
Atau pertahankan notasi gabung gaya lama Anda:
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
Perhatikan contoh berikut:http://rextester.com/ZGYF56786
atau gambar di bawah
Lihat kapan penggabungan terjadi antara negara, negara bagian, dan kota. state diulang karena join ke kota, membuat state tidak lagi unik di kolom itu, dengan melakukan pembedaan kita hanya mengembalikan hitungan 2 state, bukan 7, satu untuk setiap 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.
+-----+------------+-------------+
Saya pikir Anda menginginkan hasil pertama karena hanya ada 2 negara bagian di tabel AS yang terdaftar dan 7 kota.