[R]Un problème basique sur MYSQL, quelqu'un peut-il m'aider.
11 messages • Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
- John Smith
- WRInaute impliqué

- Messages: 381
- Inscription: Mer Avr 04, 2007 11:53
[R]Un problème basique sur MYSQL, quelqu'un peut-il m'aider.
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.
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.
Dernière édition par John Smith le Jeu Jan 17, 2008 22:16, édité 1 fois.
Re: Un problème basique sur MYSQL, quelqu'un peut-il m'aider
John Smith a écrit: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.
- John Smith
- WRInaute impliqué

- Messages: 381
- Inscription: Mer Avr 04, 2007 11:53
Merci de vos réponses, j'essaierai ce soir et vous direz pour quelle solution j'ai optée.
- John Smith
- WRInaute impliqué

- Messages: 381
- Inscription: Mer Avr 04, 2007 11:53
Eh bien, j'ai fait un mix de tout et ce qui marche chez moi c'est :
Encore merci de vos précieux conseils.
- Code: Tout sélectionner
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.
John Smith a écrit:Eh bien, j'ai fait un mix de tout et ce qui marche chez moi c'est :
- Code: Tout sélectionner
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.
- John Smith
- WRInaute impliqué

- Messages: 381
- Inscription: Mer Avr 04, 2007 11:53
Oui autant pour moi, heureusement qu'il y en a qui suivent ! C'est bien :
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.
- Code: Tout sélectionner
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.
John Smith a écrit:Oui autant pour moi, heureusement qu'il y en a qui suivent ! C'est bien :
- Code: Tout sélectionner
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.
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.
- John Smith
- WRInaute impliqué

- Messages: 381
- Inscription: Mer Avr 04, 2007 11:53
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 :
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...
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: Tout sélectionner
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...
John Smith a écrit:Ben pourtant ça marche chez moi.
Ah ouaip finalement en réfléchissant un peu (ça m'arrive des fois
Jacques.
11 messages • Page 1 sur 1
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Gestion des langues et des sessions en PHP / MySQL
- Google Pack s'enrichit de 2 nouveaux logiciels gratuits
- Passage à l'heure d'été/hiver sur un forum phpBB
- Google Sitemap Generator version 1.3
- GoogleStats : analyse temps réel des visites de Google sur votre site
- Du nouveau dans le Centre pour Webmasters de Live Search
- Référencement local gratuit dans l'annuaire WebRankInfo
- Comment placer son blog dans Google Finance
- Sortie officielle de GoogleStats v2.0 !
- AdSense Tracking : statistiques détaillées sur les clics AdSense
Consultez la description détaillée des produits ou services de Google suivants : Google Sitemaps
- Partenaires pour échanges de liens
Cet outil vous liste quelques sites qui font des liens vers des sites similaires au vôtre, pour vous aider à trouver des partenaires pour des échanges de liens.
Qui est en ligne
Utilisateurs parcourant ce forum: carrel et 0 invités



le forum