effacer sujet dans une table mysql

WRInaute occasionnel
bonjour:

en faite c'est un peu plus compliqué que mon titre

j'aimerai effacer les sujets de mon forum qui se trouve dans les tables message et topics.

je souhaiterai aussi qu'il efface uniquement les sujets des id =22 et 23..et surtout qu'il laisse les 20 plus récents sujets!


ps: je vous demande ça car j'ai un script qui ajoute automatiquement des sujets tous les 15minutes et je veux pas que ma base sature!!

merci beaucoup pour vos réponses :mrgreen:
 
WRInaute occasionnel
merci c'est à peu près l'idée que j'avais..

mais par contre pour ne laisser que les 20 plus récents messages?? as tu une idée marie-claude?
 
WRInaute discret
Si tes id sont dans l'ordre, je vois un truc genre :
Code:
delete from taTable where id  < (select max(id)-20 from taTable)
 
Nouveau WRInaute
Salut,

ou un truc du genre

Code:
DELETE FROM taTable WHERE id NOT IN (SELECT id FROM taTable ORDER BY id DESC LIMIT 0,20)

(en admettant que ce soit l'id qui serve à déterminer les sujets les plus récents)

C'est pas super optimisé (surtout dans le cas où il y aurait beaucoup d'enregistrements) mais ça réalise ce dont tu as besoin.

Après le mieux c'est de faire en 2 requêtes

1) SELECT id FROM taTable ORDER BY id DESC LIMIT 0,20
=> tu récupères l'id le plus petit

2) DELETE FROM taTable WHERE id < (id le plus petit de la requête 1)
 
WRInaute occasionnel
hmm est ce bon

Code:
DELETE SELECT (forum_id= 23 or forum_id = 22) FROM topics WHERE id NOT IN (SELECT id FROM topics ORDER BY id DESC LIMIT 0,20)


donc en gros, il va effacer tous les topics des forums avec l'id=23 et 22 (forum_id)et ne laisser seulement que les 20+ récents?
 
Nouveau WRInaute
C'est plutôt

Si tu veux ne supprimer uniquement des sujets des forums 22 et 23 sauf les 20 derniers :

Code:
DELETE FROM topics WHERE id NOT IN (SELECT id FROM topics ORDER BY id DESC LIMIT 0,20) AND forum_id IN (22,23)

Ou, si tu veux supprimer tous les sujets des forums 22 et 23 + tous les autre sujets sauf les 20 derniers

Code:
DELETE FROM topics WHERE id NOT IN (SELECT id FROM topics WHERE forum_id NOT IN (22,23) ORDER BY id DESC LIMIT 0,20) OR forum_id IN (22,23)

Mais ce n'est pas très clair dans ta demande :

dans les tables message et topics

A quoi correspondent ces tables ?

les sujets des id =22 et 23

le id c'est le id message ou le id topic ?
 
WRInaute occasionnel
j'essaye de mieux réexpliquer

j'ai un forum dans lequel je souhaite supprimer des messages de certains forums comme musculation avec forum_id=22 ou forum blabla forum_id=23 et j'aimerai juste garder les 20 plus récents messages dans ces forums (le reste des forums, je le fais manuellement!)

donc pour ce faire j'ai 2 tables (topics, posts) dans topics j'ai uniquement les sujets et l'id du forum à laquel il est rattaché (forum_id)

et dans post, j'ai le message avec l'id du topic (topic_id)

je dois donc supprimer dans ces 2 tables si je veux que les messages soient totalement effacer (et pas que le titre ou le message)

voila si tu veux d'autres précisions
ma table topics et ses champs
id poster subject posted last_post last_post_id last_poster num_views num_replies closed sticky moved_to forum_id question


ma table posts et ses champs
Textes complets id poster poster_id poster_ip poster_email message hide_smilies posted edited edited_by topic_id

donc post[topic_id] = topics[id}

merci beaucoup
 
WRInaute accro
delete * from ... where ( forum_id = 22 or forum_id = 23 ) order by date_du_post DESC LIMIT 20,999999999999999999999

ou
delete * from ... where ( forum_id = 22 or forum_id = 23 ) order by 'date_du_post' OFFSET 20
 
WRInaute occasionnel
c'est pas bien ça

DELETE FROM topics WHERE id NOT IN (SELECT id FROM topics ORDER BY id DESC LIMIT 0,20) AND forum_id IN (22,23)

?
 
Nouveau WRInaute
Bonjour

Essaye-ça peut-être :

Code:
DELETE topics, posts
FROM topics, posts
WHERE topics.id = posts.topic_id
AND topics.forum_id IN (22,23)
AND topics.id NOT IN (SELECT id FROM topics WHERE forum_id IN (22,23) ORDER BY posted DESC LIMIT 0,20)

Le problème de la requête DELETE sur plusieurs tables en même temps (avec des jointures) c'est que l'on ne peut pas, a priori, utiliser les clauses ORDER BY et LIMIT et donc qu'on est obligé de passer par une sous-requête.

La doc MySQL à ce sujet : http://dev.mysql.com/doc/refman/5.0/fr/delete.html
 
WRInaute occasionnel
j'essaye de le faire dans phpadmin mais j'ai cette erreur

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

sinon il faut le faire dans topics seulement et update messages

merci beaucoup
 
Discussions similaires
Haut