Optimisation Requete SQL

Nouveau WRInaute
Bonjour à tous ,

Je cherche à optimiser cette portion de requete qui fonctionne bien "Mais on peut surement faire mieux ;)" :

Code:
AND PF.produits_id IN (select PF.produits_id from produits_filtres PF WHERE PF.filtres_id=10)
AND PF.produits_id IN (select PF.produits_id from produits_filtres PF WHERE PF.filtres_id=15)

GROUP BY P.id

j'ai essayé :

Code:
AND PF.filtres_id in(10,15)
GROUP BY P.id 
HAVING count(*) = 2

Mais c'est plus gourmand !

Si vous avez des idées ?

Merci
 
WRInaute accro
Bonjour Monsieur

Si je comprend bien, le résultat doit être la conjonction des deux ensembles d'éléments dont l'élément filtre est soit 10 soit 15.

Normalement, ta requête MySQL récente, semble avoir une rédaction claire et précise, aussi bien formelle que côté focntionnalité.

Quant à la charge relative des deux requêtes ( première requête : deux requêtes indépendantes de filtrage, requête plus récente : une seule requête de filtrage avec une condition il est vrai équivalente à OR, mais sur seulement deux valeurs : 10 et 15, je pense que l'occupation mémoire est censée être optimisée par le moteur MySQL, et en tout cas, une requête au lieu de deux, il n'y a pas photo.

Ta requête MySQL récente, me semble plus rapide et économe en mémoire que la première requête.

Je ne sais pas s'il serait possible de faire une seule requête MySQL d'union du type :

SELECT produits_id FROM produits_filtres WHERE filtres_id=10 UNION SELECT produits_id FROM produits_filtres WHERE filtres_id=15;

Je laisse à d'autres le soin de dire si cette dernière requête, est bien optimisée par le moteur MySQL.

En tout cas, sous l'angle purement formaliste SQL, cette dernière requête me paraîtrait plus en accord avec la norme du langage SQL, compte tenu du problème posé, qui correspond exactement à cette syntaxe.

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
Rebonjour Monsieur

Je corrige l'erreur que j'ai faite dans la requête MySQL.

Voici la requête théoriquement correcte.:

SELECT produits_id FROM produits_filtres WHERE filtres_id=10 INTERSECT SELECT produits_id FROM produits_filtres WHERE filtres_id=15;

Le résultat, est bien la conjonction des résultats des deux requêtes MySQL ( valeurs 10 et 15 ).

J'étais obnubilé par le mot "OR" que j'avais mentionné par erreur comme condition reliant les deux requêtes.

Je pense ( les autres intervenants pourront confirmer ou infirmer ), que ce type de requête, est bien optimisé come il faut par le moteur MySQL.

Bien amicalement.

Jean François Ortolo
 
Nouveau WRInaute
bonjour Jean François,

Merci pour ces précisions

Je cherche bien comme condition ou les valeurs sont égales à 10 ET 15 du même champ (meme voir plus de conditons...)
dans un monde parfait AND champ= 10 AND champ = 15 mais non ;)

Parfois 2 requetes sont plus perfomantes Que 1,


Je testerais ta proposition.

Merci

Franck
 
Discussions similaires
Haut