Aller au contenu

Sujets conseillés

Posté

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.

Posté

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.

Posté

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 !

Posté

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

Posté

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 :)

Posté

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.

Posté

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

Posté

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 :)

Veuillez vous connecter pour commenter

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



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