Page 1 sur 2
table - 1 table
Posté : 01 sept. 2005, 11:59
par YoYo__
Bonjour,
Je suis sur une base en sql.
J'ai une table newsletter avec les champs id,prenom,nom,email.
J'ai une seconde table news_HS avec les champs ID,email.
Je voudrais supprimer tous les emails de ma table newsletter qui sont présent dans la table news_HS.
Donc j'ai écrit le script suivant :
$i=1;
$update1="SELECT * FROM newsletter";
$result1=mysql_query($update1) or die (mysql_error());
while ($row=mysql_fetch_array($result1)) {
$update2="SELECT * FROM news_HS";
$result2=mysql_query($update2) or die (mysql_error());
while ($row2=mysql_fetch_array($result2)) {
if ($row['email']==$row2['email']){
$ID=$row['id'];
$delete="DELETE FROM newsletter WHERE id='$ID'";
$result_delete=mysql_query($delete) or die (mysql_error());
echo "ok$i<BR>";
$i++;
}
}
}
Le pb c'est que mon code n'est pas optimisé et le serveur n'a pas l'air de suivre mon usine à gaz...
Y a t il un moyen de simplifier cette requete ?
Posté : 01 sept. 2005, 12:07
par ouckileou
tu peux faire ceci directement en SQL en utilisant une jointure
si c'est bien ID qui relie une table à l'autre, qqchose comme ça :
Code : Tout sélectionner
DELETE FROM newsletter n
INNER JOIN news_HS n_HS ON n.id = n_HS.id
Posté : 01 sept. 2005, 13:49
par YoYo__
Je pense pas que ca soit ca car les id ne sont pas identiques, ils n'ont rien a voir entre eux.
L'idée c'est de soustraire les emails de la table news_HS à ceux de la table newsletter pour ne garder que les emails valides...
Il n'existe pas une fonction pour comparer 2 tables et faire soustraire la différence ?
Posté : 01 sept. 2005, 13:57
par ouckileou
alors je me suis simplement trompé sur la clé étrangère
réponse à ta question :si, avec une jointure
donc la requête que je t'ai donné, mis à part les ID
correction :
Code : Tout sélectionner
DELETE FROM newsletter n
INNER JOIN news_HS n_HS ON n.email = n_HS.email
en français :
supprimer les lignes de la table "newsletter" dans lesquelles le champ "email" correspond au champ "email" d'une ligne de la table "news_HS"
et ça, ça doit correspondre à ce que tu veux
tu peux tester avant en remplaçant simplement le DELETE par un SELECT
Posté : 01 sept. 2005, 14:10
par YoYo__
aie!
Ca me met ce message d'erreur :
You have an error in your SQL syntax near ' n INNER JOIN news_HS n_HS ON n.email = n_HS.email ' at line 1
et voila le script:
mysql_connect($dbhost,$dbuser,$dbpass) or die (mysql_error());
mysql_selectdb($dbname);
$update1="DELETE FROM newsletter n INNER JOIN news_HS n_HS ON n.email = n_HS.email ";
$result1=mysql_query($update1) or die (mysql_error());
Posté : 01 sept. 2005, 14:19
par ouckileou
apparament il y a des particularités avec les alias sur un DELETE...
essaye comme ça :
Code : Tout sélectionner
DELETE FROM newsletter AS n INNER JOIN news_HS AS n_HS ON n.email = n_HS.email
et si ça ne marche pas, alors utilise le nom complet des tables
Code : Tout sélectionner
DELETE FROM newsletter INNER JOIN news_HS ON newsletter .email = news_HS.email
Posté : 01 sept. 2005, 14:25
par YoYo__
Désolé....
Ca marche toujours pas...
You have an error in your SQL syntax near 'AS n INNER JOIN news_HS AS n_HS ON n.email = n_HS.email ' at line 1
aucune des requetes précédentes...
faute aux alias ??
Posté : 01 sept. 2005, 14:32
par ouckileou
bon en fait il semble que c'est la syntaxe de la jointure qui n'est supportée que depuis MySQL 4.0.2, avec JOIN
je n'avais jamais testé donc je ne savais pas
utilise alors cette forme là :
Code : Tout sélectionner
DELETE FROM newsletter WHERE newsletter.email = news_HS.email
mais bon, tu as une base de tests j'espère ?
on ne sait jamais

Posté : 01 sept. 2005, 14:41
par YoYo__
NAN c'est pas vrai!!!!!!!!
Je viens de perdre toutes mes tables!!!!!!!!!!!!!!!!!!!!!!!!
....
....
....
....
nan jrigole !!!!
Bon c'est pas drôle ok
Ca marche tjrs pas...
Unknown table 'news_HS' in where clause
alors qu'elle existe bien!!!!

Posté : 01 sept. 2005, 15:00
par YoYo__
J'ai une autre piste sinon avec des instructions imbriquées :
"DELETE FROM newsletter WHERE email in ('select email from news_HS');
mais :
ERROR: Apostrophe non fermé @ 0
STR: "
SQL: "DELETE FROM newsletter WHERE email in ('select email from news_HS');
requête SQL :
"DELETE FROM newsletter WHERE email in ('select email from news_HS');
MySQL a répondu:
You have an error in your SQL syntax near '"DELETE FROM newsletter WHERE email in ('select email from news_HS')' at line 1
Posté : 01 sept. 2005, 15:10
par ouckileou
les sous-requêtes ne sont implémentées que depuis MySQL4.1, quelle est ta version ?
j'avoue que je ne comprends pas bien pourquoi la dernière requête que je t'ai donné ne fonctionne pas...

Posté : 01 sept. 2005, 15:46
par Invité
C'est une très bonne question, je suis hébergé chez online mais je n'ai pas trouvé d'indications sur la version de mysql...
avec une commande peut-etre..
Posté : 01 sept. 2005, 15:48
par ouckileou
Posté : 01 sept. 2005, 15:50
par YoYo__
3.23.47-log !!!

Posté : 01 sept. 2005, 15:53
par ouckileou
3.23.47-log !!!
ce n'est pas si étonnant MySQL 4 n'est pas si vieux (vieille ?

)
donc ça exclue les sous-requêtes, par contre le DELETE avec jointure devrait marcher
si tes données ne sont pas confidentielles, je serais curieux d'avoir une petite partie de tes tables pour tester
ou alors la structure au moins
possible ?