8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je voudrais faire une requete DELETE qui supprime tous les enregistrements d'une table, mais en gardant les 6 derniers ID (Les 6 plus grands ID).

Pouvez vous m'aider ?

Merci
Salut,

Comme précisé dans les règles du forum (règle 16), Alsacréations est une communauté ou l'entraide est de mise, mais pas l'assistance. Les membres de ce forums sont bénévoles, et ne sont pas là pour faire le travail à ta place, mais éventuellement t'aider à résoudre les problèmes que tu rencontre dans le domaine du web.

Aussi, il est fort peu probable que tu obtienne réponse. Je ne saurais que te conseiller de commencer toi même à réaliser ce que tu veux, et venir présenter son avancement si tu rencontre des difficultés.
Modérateur
sff a écrit :
Bonjour,

Je voudrais faire une requete DELETE qui supprime tous les enregistrements d'une table, mais en gardant les 6 derniers ID (Les 6 plus grands ID).

Pouvez vous m'aider ?

Merci


Hello,

Je ne suis pas très en forme ce soir (en forme de quoi) ? Cependant, je pense que tu cherches à faire ce genre de choses non ?

DELETE FROM une_table WHERE id < MAX(id) - 6;


<<<EDIT
Pourquoi supprimer en grande quantité des données ? C'est une table pour le chat ? (pas le chat et la souris) Smiley langue
EDIT;

bon code

ps : avant de supprimer, toujours faire une sélection afin de voir ce que l'on va supprimer. Smiley cligne
Modifié par Nolem (13 Dec 2009 - 02:13)
Bonsoir,

en combinant les clauses ORDER BY et LIMIT, une solution simple (valable avec mysql en tout cas):

DELETE FROM table ORDER BY id DESC LIMIT 6


La clause "ORDER BY id DESC" permet d'indiquer que tu veux supprimer les id en partant de la fin. La clause LIMIT indique le nombre de lignes à supprimer (6, ou tout si la table compte moins de 6 lignes).

Pour les détails, tu peux te reporter à la doc: Syntaxe de DELETE

Polly-Jean
Modérateur
Polly-Jean a écrit :

[...]
DELETE FROM table ORDER BY id DESC LIMIT 6

[...]


Là en lisant, je ne crois pas que ce soit bon. Je crois que cette query va supprimer les 6 derniers enregistrements alors que ce sont les enregistrements antérieurs aux 6 derniers qui doivent être supprimés. Toutefois, je peux me tromper...
Modifié par Nolem (13 Dec 2009 - 02:57)
Nolem a écrit :
Là en lisant, je ne crois pas que ce soit bon. Je crois que cette query va supprimer les 6 derniers enregistrements alors que ce sont les enregistrements antérieurs aux 6 derniers qui doivent être supprimés. Toutefois, je peux me tromper...


Très juste... J'avais lu trop vite... Smiley confused
Nolem a écrit :

DELETE FROM une_table WHERE id < MAX(id) - 6;

Ce serait plutôt
DELETE FROM une_table WHERE id < (Select MAX(id) FROM une_table) - 6;
et c'est à éviter car lourd en ressources.
Heyoan a écrit :

Ce serait plutôt
DELETE FROM une_table WHERE id < (Select MAX(id) FROM une_table) - 6;
et c'est à éviter car lourd en ressources.

Tu voulais écrire "where id > ...".
Le résultat de ta requête est plutôt incertain ... Si les id ne se suivent pas parfaitement ça n'effacera pas les 6 derniers enregistrements (si l'avant dernier id est 100 et le dernier 110 par exemple).

De plus, tu dis que la sous-requête est peu élégante, elle n'est pas déconseillée dans la documentation de mysql.
Modifié par loicbcn (13 Dec 2009 - 11:25)
loicbcn a écrit :
Tu voulais écrire "where id > ...".
C'est plutôt incertain, si les id ne se suivent pas parfaitement. (si l'avant dernier id est 100 et le dernier 110, ça n'effacera pas les 6 derniers).
Non : je voulais bien dire < en partant bien sûr du principe que l'id est déclaré en auto-increment. Si ça n'est pas le cas il faudrait effectivement partir sur ta requête ou plus probablement se reposer des questions quant à la structure de la table.

loicbcn a écrit :
De plus, tu dis que la sous-requête est peu élégante, elle n'est pas déconseillée dans la documentation de mysql.
Je ne dis pas qu'une sous-requête est peu élégante et bien sûr qu'elle n'est pas déconseillée puisque dans bien des cas elle simplifie la vie. Smiley cligne

Je dis juste que dans la requête que tu proposes c'est très lourd en ressources (plus encore à cause du NOT IN) et que si c'est possible il faut éviter (cf. optimisation des requêtes SQL).
Oui, pardon pour le signe ">", l'objectif est de garder les 6 derniers et non de les effacer, j'm'ai trompé.
D'ailleurs Loicbcn j'avais déja essayé ceci :

DELETE FROM rpg_news WHERE id NOT IN (SELECT id FROM rpg_news WHERE type='1' ORDER BY id DESC LIMIT 0,6

Mais visiblement, impossible de le faire fonctionner. Dans ton cas tu as déja réussi ?
Bon... j'ai un peu l'impression de parler dans le vide mais c'est pas très grave. Smiley biggol

Si ta requête ne fonctionne pas ça peut venir de la parenthèse de fermeture manquante (mais je suppose que c'est un problème de copié / collé) ou de ta version de Mysql (les sous-requêtes ne sont disponibles que depuis la 4.1).
Le code complet de ma requête c'est ça :

$delete = mysql_query(sprintf("DELETE FROM rpg_news WHERE id NOT IN (SELECT id FROM rpg_news WHERE type='1' ORDER BY id DESC LIMIT 0,6)", 
			mysql_real_escape_string($_POST['type'])));


Je pense pas avoir fais de fautes.

Concernant mysql j'ytilise la dernière version stable.
Oui excuse remplace le 1 par %d. J'avais mal recopié, mais ça fonctionne pas pour autant.
Ca me marque "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'".

Ce qui est incompréhensible vu que j'utilise la dernière version de mysql.
Pages :