Programmation.php : mysql et requetes imbriques
Posté par smorico (page perso, ) le 10 novembre 2004
Bonjour,
J'ai un petit souci avec mysql. J'ai trois tables :
Produit avec Prod_ID et Prod_Nom
Societe avec Societe_ID et Societe_Nom
Et une table SocieteProd qui permet de savoir quel société a quel produit.
SocieteProd :
SocieteProd_ID
Produit_ID
Societe_ID
Mon programme (en php) permet d'attribuer un ou plusieurs produits à une société. Ce que j'aimerais faire, c'est que lorsque l'utilisateur ajoute un produit, seul les produits que la société ne possède pas soient présentés dans la liste. J'avais donc pensé à une requete imbriqué du style :
SELECT Prod_Nom FROM Produit WHERE Prod_ID NOT IN (SELECT Prod_ID FROM SocieteProd WHERE SocieteID = $societe_id)
Le Pb c'est que ça ne fonctionne pas sous mysql ! mysql ne sais apparemment pas gérer les requetes imbriqués....
Ma question est donc la suivante : Est-ce possible de réaliser ce type de requete uniquement avec des jointures (LEFT JOIN etc...)???
Sinon voyez vous une autre solution ??
J'ai un petit souci avec mysql. J'ai trois tables :
Produit avec Prod_ID et Prod_Nom
Societe avec Societe_ID et Societe_Nom
Et une table SocieteProd qui permet de savoir quel société a quel produit.
SocieteProd :
SocieteProd_ID
Produit_ID
Societe_ID
Mon programme (en php) permet d'attribuer un ou plusieurs produits à une société. Ce que j'aimerais faire, c'est que lorsque l'utilisateur ajoute un produit, seul les produits que la société ne possède pas soient présentés dans la liste. J'avais donc pensé à une requete imbriqué du style :
SELECT Prod_Nom FROM Produit WHERE Prod_ID NOT IN (SELECT Prod_ID FROM SocieteProd WHERE SocieteID = $societe_id)
Le Pb c'est que ça ne fonctionne pas sous mysql ! mysql ne sais apparemment pas gérer les requetes imbriqués....
Ma question est donc la suivante : Est-ce possible de réaliser ce type de requete uniquement avec des jointures (LEFT JOIN etc...)???
Sinon voyez vous une autre solution ??
> Lire le message (6 commentaires, moyenne: 1,7).
Vous avez demandé le commentaire #496080.



EXCEPT ?
Hello,
Je ne sais pas si MySQL (dans la version que tu utilises) gère le mot clé EXCEPT (en fait j'utilise PostgreSQL), mais tu peux toujours essayer un:
SELECT prod_id FROM produit EXCEPT SELECT prod_id FROM societeprod WHERE societeid=$societe_id; (1)
Avec cette requête on devrait donc obtenir les identifiants des produits uniquement.
Je suppose donc qu'il faudrait faire une jointure du style
SELECT P.prod_nom
FROM produit AS P,
(SELECT prod_id FROM produit EXCEPT SELECT prod_id FROM societeprod WHERE societeid=$societe_id) AS P1
WHERE P.prod_id=P1.prod_id;
Cela dit, si ça ne gère pas non plus la sous-requête de cette forme, ce n'est pas mieux comme proposition.
Donc si tu veux uniquement les noms de produits en une seule requête "simple", il suffirait de remplacer prod_id par pro_nom dans (1) mais cela pourrait poser des problèmes de performances si les tables ont de très nombreux enregistrement et/ou si cette requête est très souvent utilisée !
Je suis peut-être aussi totalement à côté de la plaque (ça m'arrive ... assez souvent !).