Page 1 sur 1
supprimer des elements d'une liste
Posté : 29 avr. 2008, 13:30
par pat
Bonjour,
Je possède une table avec tous mes emails et une table avec des emails qui ne sont plus bon.
Je souhaite faire une requête qui me donne uniquement les mails qui fonctionnent.
J'ai fait la requête suivante
Code : Tout sélectionner
CREATE TABLE `mail_faux` (
`id_mail_faux` int(20) NOT NULL auto_increment,
`mail_faux` varchar(100) NOT NULL default '',
PRIMARY KEY (`id_mail_faux`)
) TYPE=MyISAM AUTO_INCREMENT=3550 ;
Code : Tout sélectionner
SELECT DISTINCT t_mail.mail FROM t_mail,mail_faux WHERE t_mail.mail <> mail_faux.mail_faux
Le problème est que cette requête ne me supprime pas les mauvais mails
Posté : 29 avr. 2008, 13:42
par ouckileou
C'est normal c'est un SELECT, pour supprimer c'est DELETE.
Mais c'est mieux de commencer avec un SELECT, histoire de voir les lignes qui seront supprimées

Et ce que tu veux toi en fait ce sont les emails qui sont dans les deux tables, donc :
Code : Tout sélectionner
SELECT
DISTINCT t_mail.mail FROM t_mail
INNER JOIN mail_faux ON t_mail.mail = mail_faux.mail_faux
Edit : en fait j'ai mal lu, ça ce sera pour obtenir les emails qui ne fonctionnent pas (i.e qui sont dans la 2e table) et pouvoir les supprimer en utilisant DELETE, pas pour obtenir les emails bons. Tu ne pourras pas faire les 2 à la fois.
Posté : 29 avr. 2008, 14:00
par pat
Je veux que les résultat de ma requête me donne que les mail qui fonctionnent. Jet te donne un exemple
mail_faux : toto, tata
mail : toto, tata, titi, tutu
je veux que le résultat de ma requête soit : titi,tutu
Posté : 29 avr. 2008, 14:17
par caroube
Je ne comprends pas très bien. Ta table s'appelle mail_faux : elle doit donc contenir les mails faux. Pourquoi donc faire une jointure avec la table des mails. Tu fais un simple
Ou alors, il y a une subtilité que je n'ai pas bien compris dans ta demande
Posté : 29 avr. 2008, 14:20
par ouckileou
Ah par "supprimer" tu entendais "supprimé de la liste" ?
Si ta version le permet tu peux passer par une sous-requête :
Code : Tout sélectionner
SELECT t_mail.mail FROM t_mail
WHERE t_mail NOT IN (SELECT mail_faux FROM mail_faux)
Posté : 29 avr. 2008, 14:32
par pat
Ma version ne le permet pas
Posté : 29 avr. 2008, 17:49
par ouckileou
Alors ceci :
Code : Tout sélectionner
SELECT t_mail.mail, mail_faux
FROM t_mail
LEFT OUTER JOIN mail_faux ON t_mail.mail = mail_faux.mail_faux
WHERE mail_faux IS NULL;
Cette requête sélectionne toutes les adresses emails contenues dans les deux tables, grâce à la jointure (ON =)
Mais AUSSI les lignes de t_mail qui ne satisfont pas la condition (LEFT OUTER JOIN), qui n'auront pas de correspondance "mail_faux" dans "mail_faux". "mail faux" sera donc remplacé par NULL.
On filtre ensuite les lignes retournées, on ne prend que celles qui ont NULL, car ce sont les adresses emails qui ne sont pas dans la table mail_faux, donc les bonnes.
Essaie sans mettre la ligne du WHERE d'abord, pour voir ce que ça donne.
Posté : 29 avr. 2008, 20:26
par pat
Merci, ça marche bien.
Je n'aurai pas trouvé tout seul.
Posté : 29 avr. 2008, 20:37
par ouckileou
Modération :
pat, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton
en haut à gauche de ce sujet.