Suppression par requête sql

Bonjour la liste,

J'ai une grosse quantité d'articles à supprimer de mon backoffice spip, habituellement, j'y arrive sans trop de souci via une requête sql exécutée par un phpmyadmin les plus quelconques.

Aujourd'hui, mon problème est autre. J'ai quelques milliers d'articles, mais je souhaite épurer la base en ne concernant les articles taggées par un mot clé en particulier. Donc, DELETE tous les articles qui n'ont pas id_mot=mon_mot_clé.

Bref, y a de la jointure sql dans l'air. Dans ma tête, il faut d'abord collecter tout ce petit monde dans la table spip_mots_articles puis faire la jonction avec la table spip_article pour y injecter sa commande DELETE avec les id_article ressortis par ma requête précédente, mais voilà, c'est dans ma tête, sur le papier, je n'arrive à poser que du vide.

Merci à vous si vous avez dans un coin de votre ordi un bout de requête ou si vous avez vu passer l'info sur le net (j'ai cherché mais pas trouvé), les dieux du spip vous seront éternellement reconnaissants.

Cdt.

Tony

On Sat, 2006-07-01 at 10:30 +0200, Tony LESTERLIN wrote:

Aujourd'hui, mon problème est autre. J'ai quelques milliers
d'articles, mais je souhaite épurer la base en ne concernant les
articles taggées par un mot clé en particulier. Donc, DELETE tous les
articles qui n'ont pas id_mot=mon_mot_clé.

  tu veux supprimer la totalité des articles qui n'ont PAS le mot
clé XYZ, c'est bien ça ?

select count(*) from spip_articles a
where not exists (select 1 from spip_mots_articles ma
                    where id_mot=XYZ
                      and a.id_article=ma.id_article)

si le total ressemble bien à ce que tu cherches, y'a plus qu'à mettre
"delete" à la place de "select count(*)"

avant ça, tu peux aussi mettre "select id_article" et finir
par "limit 0,10" pour voir si les id ont l'air de coller.

dans tous les cas, commence par une sauvegarde :wink:

--
À+, Pif.

christian lefebvre wrote:

On Sat, 2006-07-01 at 10:30 +0200, Tony LESTERLIN wrote:

Aujourd'hui, mon problème est autre. J'ai quelques milliers d'articles, mais je souhaite épurer la base en ne concernant les articles taggées par un mot clé en particulier. Donc, DELETE tous les articles qui n'ont pas id_mot=mon_mot_clé.
   
tu veux supprimer la totalité des articles qui n'ont PAS le mot
clé XYZ, c'est bien ça ?

select count(*) from spip_articles a
where not exists (select 1 from spip_mots_articles ma
                   where id_mot=XYZ
                     and a.id_article=ma.id_article)

si le total ressemble bien à ce que tu cherches, y'a plus qu'à mettre
"delete" à la place de "select count(*)"

avant ça, tu peux aussi mettre "select id_article" et finir
par "limit 0,10" pour voir si les id ont l'air de coller.

dans tous les cas, commence par une sauvegarde :wink:

attends , y a pas des références dans d'autres tables à nettoyer ?
comme , mettons :
mysql> show tables like '%arti%';
+-------------------------+
| Tables_in_spip (%arti%) |
+-------------------------+
| spip_articles |
| spip_auteurs_articles |
| spip_documents_articles |
| spip_mots_articles |
| spip_referers_articles |
| spip_syndic_articles |
| spip_visites_articles |
+-------------------------+

J'ose imaginer que c'est pas aussi simple.
à+
--
toggg

On Sat, 2006-07-01 at 13:33 +0200, bertrand Gugger wrote:

attends , y a pas des références dans d'autres tables à nettoyer ?
comme , mettons :
mysql> show tables like '%arti%';
+-------------------------+
| Tables_in_spip (%arti%) |
+-------------------------+
| spip_articles |
| spip_auteurs_articles |
| spip_documents_articles |
| spip_mots_articles |
| spip_referers_articles |
| spip_syndic_articles |
| spip_visites_articles |
+-------------------------+

  pour visites, je sais pas, pour les autres, il y a des
nettoyages automatiques dans base/optimiser.php