Requête multipliée ...

Statut
N'est pas ouverte pour d'autres réponses.

SkYlEsS

Elite
Bon, j'me remet un peu à coder mon site et paf' j'me rends compte que j'ai oublié pas mal de truc.

Bref, j'ai besoin de purger ma base de donnée de tous les identifiants dont "ad_status" est égal à 1 et ce, dans chaque table. Comme j'ai 40 000 inscrits, je vais procéder par 500 pour ne pas tout faire exploser ...

Comment faire ? Un while ? Un for ? Un 'LIMIT 500' fonctionnerait-il ?

Code:
$id_joueur = mysql_fetch_array(mysql_query("SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' LIMIT 500"));
	
		mysql_query("DELETE * FROM ad_joueurs WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_profils WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_fournitures WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_associes WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_secretaires WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_events WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_forum WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_verdicts WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_affaires WHERE id_joueur = '$id_joueur'");
		mysql_query("DELETE * FROM ad_comp_won WHERE id_joueur = '$id_joueur'");
 

Bingo

Beer Addict
SkYlEsS a dit:
Bref, j'ai besoin de purger ma base de donnée de tous les identifiants dont "ad_status" est égal à 1 et ce, dans chaque table. Comme j'ai 40 000 inscrits, je vais procéder par 500 pour ne pas tout faire exploser ...
A brûle pourpoint, un commentaire : n'importe quel moteur de base de données est capable de supprimer 40.000 enregistrements d'une table sans exploser !
 

guslinux

Gamerz'ien
Renseignes toi sur la clause "IN", mais je ne sias plus si ca marche avec un DELETE ...
 

AcidBird

Elite
Comme dit Bingo, ca ne devrait pas poser de problème !

Sinon, en transact SQL, tu as le TOP qui te permet de ne traiter que les x premier records qui doit être valabe pour le delete. Je crois que c'est limit en mySql mais je vais pas le jurer ...
 

Calvin80

Respect is key
perso je n'hesiterais pas une seconde: tout d'un coup.

maintenant si tu n'est pas sur de ta requete...tu peux ajouter un champ 'deleted' avec un 'false' par défaut. Plutot qu'un delete tu faus un update deleted=true where...

puis tu verifie que c ok, et si ça l'est , tu vires tout ce qui est deleted = true....

mais comme dit gus:
DELETE * FROM ad_joueurs WHERE id_joueur IN ( SELECT id_joueur FROM.....)
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Calvin80 a dit:
DELETE * FROM ad_joueurs WHERE id_joueur IN ( SELECT id_joueur FROM.....)
J'comprends pô trop cette fonction, tu sais m'en dire plus stp ?! (J'trouve pô d'infos valables là-dessus ...)

Dans mon cas, comment dois-je m'y prendre ... ?
 

La Poubelle

Pou'r allé Danché
SkYlEsS a dit:
J'comprends pô trop cette fonction, tu sais m'en dire plus stp ?! (J'trouve pô d'infos valables là-dessus ...)

Dans mon cas, comment dois-je m'y prendre ... ?
Il veut supprimer les sous tables en liant directement, mais avec une liaison comme ça, cela ne marchera pas.

par contre,

DELETE id_joueur as adProfils
FROM ad_profils
WHERE adProfils =(SELECT id_joueur as adJoueurs FROM ad_joueurs
WHERE ad_status = '1' and adJoueurs = adProfils)
 

guslinux

Gamerz'ien
La Poubelle a dit:
DELETE id_joueur as adProfils
FROM ad_profils
WHERE adProfils =(SELECT id_joueur as adJoueurs FROM ad_joueurs
WHERE ad_status = '1' and adJoueurs = adProfils)
Tu ne peux pas mettre adProfils=(SELECT ...) car le SELECT va te renvoyer plus d'une valeur. A la place du "=" tu dois mettre "IN".
 
1er
OP
SkYlEsS

SkYlEsS

Elite
DELETE id_joueur as adProfils
FROM ad_profils
WHERE adProfils IN (SELECT id_joueur as adJoueurs FROM ad_joueurs
WHERE ad_status = '1' and adJoueurs = adProfils)

?
 

La Poubelle

Pou'r allé Danché
guslinux a dit:
Tu ne peux pas mettre adProfils=(SELECT ...) car le SELECT va te renvoyer plus d'une valeur. A la place du "=" tu dois mettre "IN".
adJoueurs = adProfils
 

Calvin80

Respect is key
La Poubelle a dit:
Il veut supprimer les sous tables en liant directement, mais avec une liaison comme ça, cela ne marchera pas.
ha ? :baille:
 

Calvin80

Respect is key
SkYlEsS a dit:
J'comprends pô trop cette fonction, tu sais m'en dire plus stp ?! (J'trouve pô d'infos valables là-dessus ...)

Dans mon cas, comment dois-je m'y prendre ... ?
bien aprs_ le IN, tu dois mettre une liste d'id dont tu veux effacer les donnes..

une liste est de la forme (id1,id2,id3,...)
 

La Poubelle

Pou'r allé Danché
Calvin80 a dit:
Ton principe aurait été intéressant pour modifier des procédures stockées, mais ça n'a pas fonctionné :mrgreen:

Faut toujours tenter :p
 

Calvin80

Respect is key
La Poubelle a dit:
Ton principe aurait été intéressant pour modifier des procédures stockées, mais ça n'a pas fonctionné :mrgreen:
Procédure stockées ??? quel est le rapport ???

je crois que j'ai rien compris au problème....

je vois pas en quoi faire :
DELETE * FROM ad_profils WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_fournitures WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_associes WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_secretaires WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_events WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_forum WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_verdicts WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_affaires WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
DELETE * FROM ad_comp_won WHERE id_joueur IN (SELECT id_joueur FROM ad_joueurs WHERE ad_status = '1' );
puis en dernier
DELETE * FROM ad_joueurs WHERE ad_status= '1';
ne résoud pas son problème ?

on peut me dire que c'est pas optimisé, ça ok .
Le mieux aurait été de faire un select into une table temporaire et de faire les jointures sur la table, et le mieux de mieux, ça aurait été de mettre ne foreign key pour chaque table avec une contrainte 'delete cascade'.
 

Bingo

Beer Addict
Tu peux le faire en une seule fois je pense.

Code:
DELETE FROM 
	ad_profils,
	ad_fournitures,
	ad_associes,
	ad_secretaires,
	ad_events,
	ad_forum, 
	ad_verdicts, 
	ad_affaires, 
	ad_comp_won
USING 
	ad_profils, 
	ad_fournitures, 
	ad_associes, 
	ad_secretaires,
	ad_events, 
	ad_forum, 
	ad_verdicts, 
	ad_affaires, 
	ad_comp_won, 
	ad_joueurs
WHERE ad_joueurs.ad_status = '1'
	AND ad_profils.id_joueur = ad_joueurs.id_joueur
	AND ad_fournitures = ad_joueurs.id_joueur 
	AND ad_associes = ad_joueurs.id_joueur 
	AND ad_secretaires = ad_joueurs.id_joueur
	AND ad_events = ad_joueurs.id_joueur 
	AND ad_forum = ad_joueurs.id_joueur 
	AND ad_verdicts = ad_joueurs.id_joueur 
	AND ad_affaires = ad_joueurs.id_joueur 
	AND ad_comp_won = ad_joueurs.id_joueur;
Calvin80 a dit:
le mieux de mieux, ça aurait été de mettre ne foreign key pour chaque table avec une contrainte 'delete cascade'.
Ca n'existe pas sur des tables MyISAM il me semble ?
Si on veut faire du SQL avancé (intégrité référentielle, procédure stockées, déclencheurs, etc...), le plus sage est de passer à un SGBD un peu plus puissant que MySQL.
Avis personnel, évidemment ! ;)
 

La Poubelle

Pou'r allé Danché
Ca passe en SQLServer Bingo ?
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Comme d'hab', la haine :

DELETE FROM au lieu de DELETE * FROM ... :shut:
 
1er
OP
SkYlEsS

SkYlEsS

Elite
Oups, ma BDD a été trop sollicitée ... je crains qu'elle ne soit mise en quarantaine momenténament !

Je vais encore devoir m'expliquer avec la hotline et faire des promesses comme les politiciens ;-D
 

neku

Codeur roumain
Truncate Table ;)
 

Bingo

Beer Addict
La Poubelle a dit:
Ca passe en SQLServer Bingo ?
Non c'est que du MySQL ça, c'est tout sauf standard ! :pfrt:
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut