8791 sujets
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.
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.
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)

EDIT;
bon code
ps : avant de supprimer, toujours faire une sélection afin de voir ce que l'on va supprimer.

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):
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
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
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)
Heyoan a écrit :
Ce serait plutôtet c'est à éviter car lourd en ressources.DELETE FROM une_table WHERE id < (Select MAX(id) FROM une_table) - 6;
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 :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.
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).
loicbcn a écrit :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.
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 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).
Bon... j'ai un peu l'impression de parler dans le vide mais c'est pas très grave.
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).

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 :
Je pense pas avoir fais de fautes.
Concernant mysql j'ytilise la dernière version stable.
$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.
sff a écrit :Eh bien si : cf. mysql_real_escape_string ou sprintf.
Je pense pas avoir fais de fautes.
Dans ce cas le or die(mysql_error()) est ton ami.
Voir également : http://dev.mysql.com/doc/refman/5.0/fr/subquery-errors.html
Voir également : http://dev.mysql.com/doc/refman/5.0/fr/subquery-errors.html