国は複数の州を持つことができ、これらの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
次の例を考えてみましょう。
または下の絵
国、州、都市の間でいつ結合が発生するかを確認します。都市への参加により州が繰り返され、その列で州が一意でなくなります。個別に行うことで、レコードごとに1つずつ、7ではなく2つの州のカウントのみが返されます。
+-----+------------+-------------+
| 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つの都市しかないため、最初の結果が必要だと思います。