Page 1 sur 1

2 Select dans la même requête ...

Posté : 11 mai 2007, 13:11
par ZeDeveloppeur
salut tout le monde,

je me pose la question parce que j'ai la requête du type :

SELECT ....... NOT IN (SELECT......) qui ne passe pas (erreur de syntaxe)

Code : Tout sélectionner

SELECT idarticle FROM TABLE AS PT1 WHERE PT1.idfamille =1788 AND idarticle NOT IN ( SELECT idarticle FROM TABLE AS PT2 WHERE PT2.idfamille =1713 )
j'utilise la version 4.0.16 de Mysql

vous pensez que ma version de Mysql ne permet pas d'utiliser ce genre de requête ?

merci d'avance :)

Posté : 11 mai 2007, 13:15
par Hubert Roksor
Ben non, et c'est précisé dans le manuel au chapitre de SELECT, d'ailleurs. Réécris la requête pour utiliser une jointure LEFT JOIN : http://dev.mysql.com/doc/refman/4.1/en/ ... eries.html

Posté : 11 mai 2007, 15:26
par ZeDeveloppeur
salut,

merci pour la réponse....je vais voir avec les LEFT Join .

Posté : 11 mai 2007, 15:37
par ZeDeveloppeur
mouais j'ai beau me pencher sur la partie concernant la requête que j'aimerai faire je ne trouve pas.

je dois m'emmeler les pinceaux parce que T1 et T2 sont chez moi une seule et même table et que j'ai des "Where" sur d'autres champs...

The queries:

SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2);
SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);

Can be rewritten using IN():

SELECT table1.* FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;


je crois que je viens de m'embrouiller :oops:

Posté : 11 mai 2007, 17:20
par Hubert Roksor
Si j'ai bien compris ta requête tu cherches à récupérer les idarticle de l'idfamille 1788 qui ne possèdent pas de correspondance avec l'idfamille 1713 en utilisant idarticle comme relation.

Je récapitule:
  • récupérer les idarticle de l'idfamille 1788

    Code : Tout sélectionner

    SELECT PT1.idarticle FROM TABLE PT1 WHERE PT1.idfamille = 1788
  • correspondance [...] utilisant idarticle comme relation

    Code : Tout sélectionner

    SELECT PT1.idarticle FROM TABLE PT1 JOIN TABLE PT2 ON PT2.idarticle = PT1.idarticle WHERE PT1.idfamille = 1788
  • correspondance avec l'idfamille 1713

    Code : Tout sélectionner

    SELECT PT1.idarticle FROM TABLE PT1 JOIN TABLE PT2 ON PT2.idarticle = PT1.idarticle AND PT2.idfamille = 1713 WHERE PT1.idfamille = 1788
  • pas de correspondance avec l'idfamille 1713

    Code : Tout sélectionner

    SELECT PT1.idarticle FROM TABLE PT1 LEFT JOIN TABLE PT2 ON PT2.idarticle = PT1.idarticle AND PT2.idfamille = 1713 WHERE PT1.idfamille = 1788 AND PT2.idfamille IS NULL
Et voilà qui devrait te renvoyer les données que tu recherches.

PS: prévois un index sur (idfamille,idarticle) pour des performances optimales

Posté : 11 mai 2007, 17:50
par ZeDeveloppeur
Oui tu as bien compris ma requête !!

en fait je ne savais pas comment faire pour les idfamille .......

merci pour ton aide, mais surtout pour ton raisonnement décortiqué, ca va m'aider pour plus tard !!


chapeau !