0
votes

Quelle requête SQL à utiliser pour supprimer uniquement les résultats en double pour la table wp_comments?

Je dois terminer la requête de sélection ci-dessous. La requête me montre le nombre de commentaires avec le même comment_id.Je veux juste en fin de compte supprimer les doublons et laisser les non doublons seuls.Il s'agit d'une capture d'écran de la base de données wordpress des résultats de ma requête actuelle

SELECT `comment_ID`, `comment_ID`, count(*) FROM `wp_comments` GROUP BY `comment_ID` HAVING COUNT(*) > 1 ORDER BY `count(*)` ASC

exemple de 2 entrées dont je dois en supprimer une


4 commentaires

Comment_ID est-il séquentiel et supprimeriez-vous tous les enregistrements sauf le premier?


@JimmySmith Je ne sais pas comment vérifier le séquentiel mais je vais essayer de répondre à votre question. La colonne comment_id suit un ordre logique. Voyez dans cette image comment il y a 2 "Nick" i.stack.imgur.com/k2zsi.png . J'ai besoin d'un "Nick" à supprimer.


Comment_ID n'est-il pas la clé primaire de cette table? comment se fait-il que vous ayez des doublons ??


@eshirvana J'ai initialement importé la base de données et les clés primaires n'ont pas été définies. J'essaie maintenant de créer la clé primaire mais j'ai des doublons pour la table wp_comments. J'ai pu réparer toutes les tables wp sauf celle-ci jusqu'à présent.


3 Réponses :


0
votes

Je recommanderais d'ajouter une clé unique à la table pour qu'elle soit automatiquement appelée tempId , afin que vous puissiez faire la distinction entre un ensemble en double, utilisez la requête ci-dessous pour supprimer les copies en double et à la fin, supprimez cette colonne `` tempid '':

DELETE FROM `wp_comments`
WHERE EXISTS (
    SELECT  `comment_ID` , MIN(`tempid`) AS `tempid`
    FROM `wp_comments` as `dups`
    GROUP BY `comment_ID` 
    HAVING 
        COUNT(*) > 1 
        AND  `dups`.`comment_ID` = `wp_comments`.`comment_ID`
        AND `dups`.`tempid` = `wp_comments`.`tempid`
        )


2 commentaires

J'obtiens ce message d'erreur "# 1054 - Colonne inconnue 'dups.comment_ID' dans 'clause ayant'"


@EsmondMccain a corrigé la requête, ne l'a pas testée, il peut y avoir une erreur de syntaxe, mais vous avez l'idée, mais cela devrait fonctionner maintenant



0
votes

Je ne sais pas pourquoi il semble y avoir deux champs différents tous deux nommés «ID_colonne» de la même table, mais je pense que cela supprimera uniquement le premier des deux enregistrements identiques. Cependant, avant d'exécuter une instruction DELETE, veillez à effectuer une sauvegarde de la table d'origine.

DELETE
   TOP 1 * 
FROM 
   'wp_comments'
WHERE 
   comment_ID IN
(
SELECT
  comment_ID,
  r,
  (comment_ID + '_' + r) AS unique
FROM 
   (
   SELECT
      `comment_ID`, 
       `comment_ID`,
       RANK() OVER (PARTITION BY 'comment_id' ORDER BY 'comment_id') AS r
   FROM
      'wp_comments'
   )
WHERE
   r>1
)


0 commentaires

1
votes

Sauvegardez d'abord votre mauvaise table au cas où vous feriez quelque chose de mal.

SELECT comment_ID, COUNT(*) num FROM wp_comments GROUP BY comment_ID;

Avez-vous réellement des enregistrements en double ici (en double dans toutes les colonnes)? Si oui, essayez ceci

CREATE TABLE wp_comments_deduped
SELECT comment_ID,
       MAX(comment_post_ID) comment_post_ID,
       MAX(comment_author) comment_author,
       MAX(comment_author_email) comment_author_email,
       MAX(comment_author_url) comment_author_url,
       MAX(comment_author_IP) comment_author_IP,
       MAX(comment_date) comment_date,
       MAX(comment_date_gmt) comment_date_gmt,
       MAX(comment_content) comment_content,
       MAX(comment_karma) comment_karma,
       MAX(comment_approved) comment_approved,
       MAX(comment_agent) comment_agent,
       MAX(comment_type) comment_type,
       MAX(comment_parent) comment_parent,
       MAX(user_id) user_id
  FROM wp_comments
 GROUP BY comment_ID;
RENAME TABLE wp_comments TO wp_comments_not_deduped;
RENAME TABLE wp_comments_deduped TO wp_comments;

S'ils n'ont pas exactement le même contenu et que vous ne vous souciez pas du contenu que vous gardez de chaque paire de lignes en double, essayez quelque chose comme ceci:

CREATE TABLE wp_comments_deduped SELECT DISTINCT * FROM wp_comments;
RENAME TABLE wp_comments TO wp_comments_not_deduped;
RENAME TABLE wp_comments_deduped TO wp_comments;

Ensuite, vous devrez vérifier à nouveau si votre déduplication a fonctionné:

CREATE TABLE wp_commments_bad_backup SELECT * FROM wp_comments;

Ensuite, une fois que vous en êtes satisfait, remettez les index de WordPress.

Conseil de pro : utilisez un plugin comme Duplicator lorsque vous migrez d'une configuration WordPress à une autre; ses auteurs ont trié toutes ces migrations de données pour vous.


2 commentaires

J'ai essayé d'utiliser votre deuxième morceau de code. J'ai dû ajouter "à" pour résoudre un exemple d'erreur de syntaxe ci-dessous. Maintenant, j'obtiens une nouvelle erreur "# 1054 - Colonne inconnue 'comment_ID' dans 'liste de champs' '". Avez-vous déjà rencontré cela? RENAME TABLE wp_comments to wp_comments_not_deduped; RENAME TABLE wp_comments_deduped to wp_comments;


Doh! J'ai oublié le «TO» et j'ai également oublié FROM wp_comments dans ma deuxième requête suggérée.