Version complète: sur le forum Webmaster Hub : Mixer deux count ?
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
captain_torche
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)
SQL
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.
Portekoi
SQL
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.
captain_torche
Super !
Je regarde ça plus à l'aise demain, mais ça a l'air de convenir à la perfection.
Après deux employeurs qui avaient de vieilles versions de MySQL, je vais ENFIN pouvoir faire des requêtes imbriquées !
Kioob
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.
CODE
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) tongue.gif
captain_torche
Je regarderai, merci wink.gif
Portekoi
Le problème des vues, c'est qu'elles ne tiennent pas compte des index. (enfin sur Sql Server, c'est le cas)

Et pour ta requête, le group by doit être sur le nom et pas sur l'id smile.gif
captain_torche
Ca change quoi, de faire un group by sur le nom ou sur l'id ?
Portekoi
Si tu fais un : "count(id) as nb, nom" tu dois faire un group by sur le nom et inversement sinon, tu auras une erreur Sql.
Kioob
En fait MySQL est très "tolérant" sur ce point, ce qui peut amener à des incohérences biggrin.gif 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 biggrin.gif
Portekoi
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 dry.gif)

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

Tout dépend de l'index smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.