Protože země mohou mít více států a každý stát může mít více měst, když se připojíte k těmto 1 k mnoha a 1 k mnoha mnoha, váš počet států je nafouknutý. Takže potřebujete zřetelný počet státu. Počet měst je již jedinečný pro zemi a stát, takže nepotřebuje rozlišovací znak. kde jako stát není jedinečný pro venkovské město, je tedy potřeba rozlišovat. To samozřejmě předpokládá, že chcete počet jedinečných států v každé zemi.
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
Nebo si ponechte svůj starý způsob zápisu spojení:
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
Zvažte následující příklad:http://rextester.com/ZGYF56786
nebo obrázkově níže
Podívejte se, kdy dojde ke spojení mezi zemí, státem a městem. stav se opakuje kvůli připojení k městu, takže stav již není v tomto sloupci jedinečný. Provedením rozlišování vrátíme pouze počet 2 stavů místo 7, jeden pro každý záznam.
+-----+------------+-------------+
| 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.
+-----+------------+-------------+
Myslím, že chcete 1. výsledek, protože v tabulce USA jsou uvedeny pouze 2 státy a 7 měst.