Bởi vì các quốc gia có thể có nhiều tiểu bang và mỗi tiểu bang có thể có nhiều thành phố khi bạn tham gia các thành phố này từ 1 đến nhiều và từ 1 đến nhiều nên số tiểu bang của bạn bị tăng cao. Vì vậy, bạn cần số lượng riêng biệt của trạng thái. Số thành phố đã là duy nhất cho quốc gia và tiểu bang, do đó không cần sự khác biệt. khi tiểu bang không phải là duy nhất đối với thành phố đồng quê, do đó cần có sự khác biệt. Tất nhiên, điều này giả định rằng bạn muốn có số lượng các tiểu bang duy nhất ở mỗi quốc gia.
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
Hoặc giữ ký hiệu tham gia kiểu cũ của bạn:
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
Hãy xem xét ví dụ sau: http://rextester.com/ZGYF56786
hoặc bằng hình ảnh bên dưới
Xem thời điểm kết hợp xảy ra giữa quốc gia, tiểu bang và thành phố. trạng thái bị lặp lại do liên kết với thành phố, làm cho trạng thái không còn duy nhất trong cột đó nữa, bằng cách thực hiện phân biệt, chúng tôi chỉ trả về số lượng 2 trạng thái thay vì 7, một cho mỗi bản ghi.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Tôi nghĩ bạn muốn có kết quả đầu tiên vì chỉ có 2 tiểu bang trong bảng của Hoa Kỳ được liệt kê và 7 thành phố.