Forum Clubic

Mysql et not in

Salut à tous,

J’ai deux tableaux, T1 et T2.
Dans les deux tableaux y’a une donnée commune T1.no et T2.id (tous deux en INT)

J’ajoute au fur et à mesure des données dans T2 provenant de T1 (pour une restructuration de la BDD)
J’aimerais récupèrer la ligne de T1 ayant le champ no le plus bas, condition : que ce no ne soit pas déjà dans T2.

J’ai fait ça :

SELECT * FROM T1 WHERE `no` NOT IN('SELECT `id` FROM T2') ORDER BY no ASC LIMIT 1

Mais ça ne me retourne que le no le plus bas de T1 alors qu’il est déjà dans T2.

Je dois mal m’y prendre… j’ai également essayé avec NOT EXISTS, mais ça me retourne une erreur SQL.

Une piste, une solution, une aide, une question ? Merci d’avance.

Bon… après avoir fouiné un peu sur le net… j’ai trouvé une solution, ça me fusionne les champs des deux tables (alors que je ne veux que ceux de la première) mais ça me convient pour l’instant.

J’ai trouvé une requete, et ai essayé de l’adapter aux noms de mes tables :

SELECT * FROM T1 LEFT OUTER JOIN T2 ON ( no=id) WHERE id IS NULL

Ca fonctionne bien, dommage que je ne comprenne pas les LEFT OUTER et compagnie… si quelqu’un a des exemples simples… :frowning:
Merci quand même.

Je n’ai pas de MySQL sous la main pour tester, mais dans ta première requête :

SELECT * FROM T1 WHERE `no` NOT IN('SELECT `id` FROM T2') ORDER BY no ASC LIMIT 1

Les ’ autour de la sous-requête m’étonnent, car du coup tu récupère les “no” qui ne sont pas égaux à la chaîne de caractères “SELECT id FROM T2”, donc forcément : tous. J’aurais plutôt vu :

SELECT * FROM T1 WHERE `no` NOT IN(SELECT `id` FROM T2) ORDER BY no ASC LIMIT 1

Edité le 10/12/2008 à 10:02