[R]Un problème basique sur MYSQL, quelqu'un peut-il m'aider.

WRInaute occasionnel
Bonsoir,

Le problème est assez simple :

J'ai deux tables MySQL. Une est remplie d'éléments, l'autre vide.

Quand je sélectionne un élément dans la première table, cet élément est inséré dans la deuxième table (sans pour autant être effacé dans la première).

Le problème se pose car je n'arrive pas à sélectionner dans la première table tous les éléments sauf ceux qui ont été inscrit dans la deuxième table.
J'avais pensé à un truc du genre :

SELECT DISTINCT tab1.id from tab1, tab2 where tab1.id <> tab2.id

Mais ça ne marche pas. Alors quelle requête doit-on écrire pour sélectionner les éléments d'une table qui n'appartiennent pas à une deuxième table.

Merci de m'apporter vos lumières.
 
WRInaute passionné
Bonsoir,

Je pencherai vers une recherche vers "not in" plutôt que vers "<>" (demande à notre ami Google)


(ma lumière est faible ce soir)
 
WRInaute accro
Re: Un problème basique sur MYSQL, quelqu'un peut-il m'aider

John Smith a dit:
Le problème se pose car je n'arrive pas à sélectionner dans la première table tous les éléments sauf ceux qui ont été inscrit dans la deuxième table.
J'avais pensé à un truc du genre :

SELECT DISTINCT tab1.id from tab1, tab2 where tab1.id <> tab2.id

Mais ça ne marche pas. Alors quelle requête doit-on écrire pour sélectionner les éléments d'une table qui n'appartiennent pas à une deuxième table.

SELECT tab1.id FROM tab1 WHERE NOT EXISTS (SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id);

SELECT tab1.id FROM tab1 EXCEPT SELECT tab2.id FROM tab2;

Jacques.
 
WRInaute occasionnel
Eh bien, j'ai fait un mix de tout et ce qui marche chez moi c'est :

Code:
SELECT DISTINCT tab1.id FROM tab1 WHERE tab2.id NOT IN(SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id)

Encore merci de vos précieux conseils.
 
WRInaute accro
John Smith a dit:
Eh bien, j'ai fait un mix de tout et ce qui marche chez moi c'est :

Code:
SELECT DISTINCT tab1.id FROM tab1 WHERE tab2.id NOT IN(SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id)

Euuuuh... Je ne crois pas trop, non. Je pense qu'il y a au moins 2 erreurs (de recopie?). A part le WHERE tab2.id NOT IN qui doit évidemment être WHERE tab1.id NOT IN (tab2 n'est pas visible dans la requête principale), la clause WHERE de requête équivaut à:

tab1.id NOT IN (tab1.id)

soit:

tab1.id <> tab1.id

soit:

0

Bref, ça ne renvoie jamais rien.

Donc si ta requête fonctionne, je pense que ce n'est pas celle là :)

Jacques.
 
WRInaute occasionnel
Oui autant pour moi, heureusement qu'il y en a qui suivent ! C'est bien :

Code:
SELECT DISTINCT tab1.id FROM tab1 WHERE tab1.id NOT IN (SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id)

Les noms de mes tables à l'origine ne sont pas ceux-là et la requête à d'autres conditions aussi, j'ai fait l'erreur en voulant la retranscrire de manière simplifiée. :roll:
 
WRInaute accro
John Smith a dit:
Oui autant pour moi, heureusement qu'il y en a qui suivent ! C'est bien :

Code:
SELECT DISTINCT tab1.id FROM tab1 WHERE tab1.id NOT IN (SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id)

Les noms de mes tables à l'origine ne sont pas ceux-là et la requête à d'autres conditions aussi, j'ai fait l'erreur en voulant la retranscrire de manière simplifiée. :roll:

Ca corrige une des deux erreurs, mais ça ne fait toujours pas ce que tu veux. Comme déjà dit, c'est équivalent à tab1.id NOT IN (tab1.id) donc à tab1.id <> tab1.id donc 0, donc pas de résultats.

Donc au choix:
- tu utilises NOT IN, et tu utilises la liste entière dans tab2: tab1.id NOT IN (SELECT tab2.id FROM tab2) comme indiqué par javases;
- tu utilises NOT EXISTS, et dans ce cas tu qualifies avec la comparaison: NOT EXISTS (SELECT tab2.id FROM tab2 WHERE tab2.id=tab1.id)
- tu utilises EXCEPT

Note que je ne sais pas si les deux derniers existent dans mysql (et/ou dans quelles versions), mais avec postgresql ça marcherait impec. Note qu'à moins que le planner soit super intelligent (et en fonction des tailles respectives de tab1 et tab2 et des index existants), la méthode du NOT EXISTS est probablement la plus efficace.

Jacques.
 
WRInaute occasionnel
Ben pourtant ça marche chez moi.

J'ai admettons 100 éléments dans ma tab1, je vois ma tab2 se remplir progressivement et le résultat se décrémenter au fur et à mesure que je rempli tab2.

J'ai peut-être un bug mais pour l'instant, il est pas apparent. Je donne exactement ma requête telle qu'elle existe sur mon site, peut-être que j'ai fait une erreur de trascription :

Code:
SELECT DISTINCT ".TABLE_AUTEUR_OEUVRES.".id FROM ".TABLE_AUTEUR_OEUVRES." WHERE type = 'originale' AND statut = 1 AND isRecueil = 0 AND ".TABLE_AUTEUR_OEUVRES.".id NOT IN (SELECT ".TABLE_AUTEUR_OEUVRES_JOUR.".oeuvre_id FROM ".TABLE_AUTEUR_OEUVRES_JOUR." WHERE ".TABLE_AUTEUR_OEUVRES_JOUR.".oeuvre_id=".TABLE_AUTEUR_OEUVRES.".id)

Cela me permet d'afficher une oeuvre par jour tirée au hasard dans ma base selon certaines conditions... Les TABLE... sont des constantes PHP...
 
WRInaute accro
John Smith a dit:
Ben pourtant ça marche chez moi.

Ah ouaip finalement en réfléchissant un peu (ça m'arrive des fois :p ) ça marche, le subselect renvoie soit tab1.id s'il est présent dans tab2, soit rien sinon, donc ça donne le résultat escompté au final. Mais ce n'est à mon avis pas la forme la plus lisible qui soit, et probablement pas la plus efficace, mais bon, tant que ça marche :)

Jacques.
 
Discussions similaires
Haut