Aller au contenu

Mixer deux count ?


captain_torche

Sujets conseillés

Je possède une base, dans laquelle je possède une table pays, une table ville, et une table établissements.

Un pays peut avoir n villes, et chaque ville peut avoir n établissements.

Je cherche, en faisant une requête, à trouver dans un premier temps les villes possédant au moins 10 établissement (ça, j'y arrive très bien)

SELECT v.Nom, COUNT(*) AS Nombre
FROM villes v LEFT JOIN etablissements e ON e.id_ville = v.id_ville
GROUP BY v.id_ville
HAVING Nombre > 10

Par contre, j'aimerais faire une seconde requête ne me ressortant que les pays comportant des villes ayant au moins 10 enregistrements.

Peut-on mixer deux COUNT dans une même requête, ou dois-je faire autrement ?

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

SELECT v.Nom, COUNT(*) AS Nombre
FROM pays v LEFT JOIN ville e ON e.id_pays = v.id_ville
WHERE v.id_ville in (
SELECT v.id_ville
FROM villes v LEFT JOIN etablissements e ON e.id_ville = v.id_ville
GROUP BY v.id_ville
HAVING Nombre > 10
)
GROUP BY v.Nom

Essaie un truc comme ca si tu peux faire des requêtes imbriquées.

Lien vers le commentaire
Partager sur d’autres sites

Petites remarques sur la première requete : ne faites des "LEFT JOIN" que lorsque c'est necessaire, de plus ici un count(e.id_ville) sera surement plus efficace.

SELECT v.Nom, COUNT( e.id_ville ) AS Nombre
FROM villes v
JOIN etablissements e ON e.id_ville = v.id_ville
GROUP BY v.id_ville
HAVING Nombre > 10

Reste à vérifier le résultat avec un EXPLAIN, mais sur ce genre de requete je suppose que la différence doit être assez importante ; enfin en supposant qu'il y ai un minimum d'indexes sur ces tables.

Et si ton nouvel employeur a poussé le luxe jusqu'à MySQL 5, tu peux aussi tenter les vues (avec modération évidement) :P

Lien vers le commentaire
Partager sur d’autres sites

En fait MySQL est très "tolérant" sur ce point, ce qui peut amener à des incohérences :D Par contre lui au moins il continue à utiliser les indexes avec les vues.... comme Oracle d'ailleurs. Je n'ai jamais testé les vues sur SQL Server en fait.

D'un point de vue "performances", le champ "id" a beaucoup plus de chance d'être indexé que le champ "nom" ; donc j'aurais bien laissé comme ça :D

Lien vers le commentaire
Partager sur d’autres sites

Ouaip mais je parle des vues "basiques" et non des vues indexées. A savoir qu'une vue, de part la façon dont elle construite peut être beaucoup plus gourmand.

A utiliser avec modération (c'est qui celui la encore <_<)

Et d'un point de vue performance, si l'index est sur l'id, il faut utiliser l'id sinon, le nom :)

Tout dépend de l'index :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...