Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir le nombre d'États et de villes du pays à l'aide d'une requête SQL à partir d'une base de données ?

Parce que les pays peuvent avoir plusieurs états et que chaque état peut avoir plusieurs villes lorsque vous joignez ces 1 à plusieurs et 1 à plusieurs, votre nombre d'états est gonflé. Vous avez donc besoin du décompte distinct de l'état. Le nombre de villes est déjà unique au pays et à l'état, il n'a donc pas besoin de la distinction. où l'état n'est pas unique à la ville de campagne, donc distinct est nécessaire. Cela suppose bien sûr que vous souhaitiez connaître le nombre d'états uniques dans chaque pays.

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

Ou en conservant votre ancien style de notation de jointure :

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

Prenons l'exemple suivant :http://rextester.com/ZGYF56786

ou illustré ci-dessous

Voir quand les jointures se produisent entre le pays, l'état et la ville. l'état est répété en raison de la jointure à la ville, ce qui rend l'état plus unique dans cette colonne, en faisant un distinct, nous ne renvoyons qu'un nombre de 2 états au lieu de 7, un pour chaque enregistrement.

+-----+------------+-------------+
| 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.
+-----+------------+-------------+

Je pense que vous voulez le 1er résultat car il n'y a que 2 états dans le tableau des États-Unis répertoriés et 7 villes.