Supprimer les enregistrements orphelins dans MySQL ?

Nouveau WRInaute
J'ai appliqué sur un de mes forums phpBB (70 000 messages, une base de données trop grande pour l'hébergeur) ce script pour alléger les 2 000 000 d'enregistrements de ma table search_word_match.

Malheureusement, le mec qui a conçu ce script n'a pas eu le bon sens de penser à l'intégrité de la base de données. Du coup ça m'a foutu en l'air la logique de ma BDD. J'assume la responsabilité d'avoir appliqué le script sans sauvegarde, mais je suis quand même blasé.

J'explique :
Quand on écrit un post dans phpBB, celui-ci recense les mots contenus (en appliquant un filtre).
Ensuite les mots sont mis dans une table mots.
Puis pour chaque mot on crée un lien entre l'id du post et l'id du mot dans une table match.

Donc j'avais 120 000 mots et 2 000 000 de match
Le script me propose de choisir des mots à virer, j'ai viré tous les mots de moins de 3 lettres ainsi que les plus utilisés sur le forum (au moins 400 000 match de gagnés a priori).

Sauf que ce script supprime bêtement les mots en premier et les match ensuite. Donc comme chez moi, il a planté après avoir viré les mots, je suis pris au piège puisqu'il m'est impossible de retrouver les match "orphelins" !!!!! :evil:

Ma question technique est donc :
Comment faire pour virer les éléments orphelins d'une table d'associations sous MySQL ?


Merci d'avance,
SBN
 
WRInaute passionné
delete from table1
where not exists(select quelquechose from table2 where table1.unchamp = table2.unchamp)
 
Nouveau WRInaute
Bon j'ai trouvé ce post et j'ai bidouillé la requete SQL de Suede.

Je crois que j'avance, j'arrive à compter les orphelins :
Code:
SELECT ls.word_id, ls.word_text, COUNT(wm.word_id) as entries 
FROM `phpbb_search_wordmatch` as wm 
LEFT JOIN `phpbb_search_wordlist` as ls ON ls.word_id=wm.word_id 
WHERE ls.word_text IS NULL
GROUP BY wm.word_id 
ORDER BY entries DESC
 
Nouveau WRInaute
arnaudmn a dit:
delete from table1
where not exists(select quelquechose from table2 where table1.unchamp = table2.unchamp)
Des requêtes imbriquées sous MYSQL ? Je crois que c'est impossible !
Je vais quand même essayer.

Edit : j'ai fait le total, si j'arrive à tout virer ça va faire 648954 enregistrements en moins et je pourrai peut etre récupérer l'accès public à ma base :roll: (OVH l'a fermée en écriture !)

Re-edit :
Nombre d'enregistrements effacés : 648954 (traitement: 31.7975 sec.)
requête SQL:
Code:
DELETE FROM `phpbb_search_wordmatch` USING `phpbb_search_wordmatch` AS wm LEFT JOIN `phpbb_search_wordlist` AS ls ON ls.word_id = wm.word_id WHERE ls.word_text IS NULL

Et j'ai gagné ..... 0 octets 8O
 
Discussions similaires
Haut