captain_torche Posté 21 Janvier 2008 Posté 21 Janvier 2008 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 NombreFROM villes v LEFT JOIN etablissements e ON e.id_ville = v.id_villeGROUP BY v.id_villeHAVING 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 Posté 21 Janvier 2008 Posté 21 Janvier 2008 SELECT v.Nom, COUNT(*) AS NombreFROM pays v LEFT JOIN ville e ON e.id_pays = v.id_villeWHERE v.id_ville in (SELECT v.id_villeFROM villes v LEFT JOIN etablissements e ON e.id_ville = v.id_villeGROUP BY v.id_villeHAVING Nombre > 10)GROUP BY v.Nom Essaie un truc comme ca si tu peux faire des requêtes imbriquées.
captain_torche Posté 21 Janvier 2008 Auteur Posté 21 Janvier 2008 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 Posté 21 Janvier 2008 Posté 21 Janvier 2008 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 NombreFROM villes vJOIN etablissements e ON e.id_ville = v.id_villeGROUP BY v.id_villeHAVING 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)
Portekoi Posté 21 Janvier 2008 Posté 21 Janvier 2008 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
captain_torche Posté 21 Janvier 2008 Auteur Posté 21 Janvier 2008 Ca change quoi, de faire un group by sur le nom ou sur l'id ?
Portekoi Posté 21 Janvier 2008 Posté 21 Janvier 2008 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 Posté 21 Janvier 2008 Posté 21 Janvier 2008 En fait MySQL est très "tolérant" sur ce point, ce qui peut amener à des incohérences 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
Portekoi Posté 21 Janvier 2008 Posté 21 Janvier 2008 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant