1 Dernière modification par Morty (24-08-2006 16:14:52)

Sujet : SQL, encore et toujours...

Encore une galère avec des requêtes SQL. Je suis preneur de suggestions...

Je cherche à récupérer les produits n'ayant pas encore de masque dans un site défini. Pour cela j'ai trouvé une requête qui fonctionne :

SELECT idProduit
FROM produit
WHERE NOT
EXISTS (

SELECT idProduit
FROM masque
WHERE idSite = "TEST"
AND product.idProduit = masque.idProduit
)

Les tables sont :
produit : idProduit
masque : idMasque, idSite, idProduit, Masque

Je me demandais s'il existait une manière de faire autrement car la requête dure bien 10 secondes (alors qu'il n'y a que 600 produits) sur mon PC et entraîne un bon freeze que je ne souhaite pas reproduire sur un serveur en prod...

Merci d'avance !

2 Dernière modification par Cyp (25-08-2006 11:35:10)

Re : SQL, encore et toujours...

Une piste : vérifie les index de tes tables masque et produit, ça joue beaucoup sur les perfs.

Sinon le not exists me semble la meilleure manière de faire, le problème ne doit pas venir de là (mais peut-etre es-tu sous mySQL et là j'y connais rien)

3 Dernière modification par FOX (25-08-2006 13:55:10)

Re : SQL, encore et toujours...

select idProduit from produit p left join masque m on m.idProduit=p.idProduit where m.idSite='TEST' and m.idProduit is null;

Et vérifier s'il y a un index sur la colonne idProduit dans la table masque.
La syntaxe peut varier d'un SGBD à l'autre.

De rien.

4

Re : SQL, encore et toujours...

Pour les indices ils étaient OK, sauf que j'ai un souci, je ne sais pas comment définir idProduit comme clé étrangère sous MySQL... Mais de toute façon j'ai trouvé un meilleur moyen.

Comme vous pouvez vous en douter, même si ce n'était pas explicite ces données approvisionnent du PHP. Comme je me doutais que c'était un calcul du genre n(n-1) au mieux ou n! au pire, j'ai sauté des étapes.
J'ai donc stocké la liste de mes produits dans un tableau, et la liste des produits du masque dans quelque chose genre $Masque["idProduit"]. Ensuite, un simple parcours de la liste des produits avec un isset($Masque["idProduit"]) et la complexité passe à n et c'est quasiment instantané.

Merci en tout cas pour vos réponses, et si vous savez comment passer mes clés étrangères, je suis preneur.