table - 1 table

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 11:59

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 ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 12:07

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

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 13:49

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 ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 13:57

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

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 14:10

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());

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 14:19

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

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 14:25

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 ??

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 14:32

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 :lol:

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 14:41

NAN c'est pas vrai!!!!!!!!

Je viens de perdre toutes mes tables!!!!!!!!!!!!!!!!!!!!!!!!

....

....

....

....

nan jrigole !!!! :wink:
Bon c'est pas drôle ok :(

Ca marche tjrs pas... :lol:

Unknown table 'news_HS' in where clause

alors qu'elle existe bien!!!!

:?:

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 15:00

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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 15:10

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... :roll:

Invité
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 15:46

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..

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 15:48

Code : Tout sélectionner

SELECT VERSION()
je crois...

YoYo__
Invité n'ayant pas de compte PHPfrance

01 sept. 2005, 15:50

3.23.47-log !!!

:shock:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

01 sept. 2005, 15:53

3.23.47-log !!!
ce n'est pas si étonnant MySQL 4 n'est pas si vieux (vieille ? :roll:)

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 ?