Omdat landen meerdere staten kunnen hebben en elke staat meerdere steden kan hebben, wordt het aantal staten opgeblazen wanneer u zich bij deze 1 tot veel en 1 tot veel veel voegt. Dus je hebt de duidelijke telling van de staat nodig. Het aantal steden is al uniek voor land en staat en heeft dus geen onderscheid nodig. waar als staat niet uniek is voor landstad, dus onderscheiden nodig is. Dit veronderstelt natuurlijk dat je het aantal unieke staten in elk land wilt hebben.
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
Of behoud je oude stijl join-notatie:
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
Beschouw het volgende voorbeeld:http://rextester.com/ZGYF56786
of hieronder afgebeeld
Kijk wanneer de joins plaatsvinden tussen land, staat en stad. staat wordt herhaald vanwege de verbinding met stad, waardoor staat niet langer uniek is in die kolom, door een onderscheid te maken, retourneren we alleen een telling van 2 staten in plaats van 7, één voor elke 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.
+-----+------------+-------------+
Ik zou denken dat je het eerste resultaat wilt, aangezien er slechts 2 staten in de tabel in de VS staan en 7 steden.