Какой sql-запрос использовать только для удаления повторяющихся результатов для таблицы wp_comments?

#mysql #sql #wordpress

#mysql #sql #wordpress

Вопрос:

Мне нужно завершить запрос select ниже. Запрос показывает мне количество комментариев с тем же comment_id.Я просто в конечном итоге хочу удалить дубликаты и оставить не дубликаты в покое.Это скриншот базы данных WordPress с моими текущими результатами запроса

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

пример из 2 записей, которые мне нужно удалить

Комментарии:

1. Является ли comment_ID последовательным, и вы бы удалили все, кроме первой записи?

2. @JimmySmith Не уверен, как проверить последовательность, но я постараюсь ответить на ваш вопрос. Столбец comment_id следует логическому порядку. Смотрите на этом изображении, как есть 2 «Ника» i.stack.imgur.com/k2zsi.png . Мне нужно удалить один «Ник».

3. Разве comment_ID не является первичным ключом в этой таблице? откуда у вас дубликат??

4. @eshirvana Я изначально импортировал базу данных, и первичные ключи не были установлены. Сейчас я пытаюсь создать первичный ключ, но у меня есть дубликаты для таблицы wp_comments. До сих пор я смог исправить все таблицы wp, кроме этой.

Ответ №1:

Сначала создайте резервную копию своей плохой таблицы на случай, если вы что-то напутали.

 CREATE TABLE wp_commments_bad_backup SELECT * FROM wp_comments;
  

У вас действительно есть повторяющиеся записи здесь (дублируются во всех столбцах)? Если да, попробуйте это

 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;
  

Если они не имеют точно такого же содержимого, и вам все равно, какое содержимое вы сохраняете из каждой пары повторяющихся строк, попробуйте что-то вроде этого:

 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;
  

Затем вам нужно будет дважды проверить, сработала ли ваша дедупликация:

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

Затем, как только вы будете довольны этим, верните индексы WordPress.

Совет профессионала: используйте плагин, подобный Duplicator, при переходе с одной настройки WordPress на другую; его авторы разобрались со всей этой миграцией данных для вас.

Комментарии:

1.Я попытался использовать ваш второй фрагмент кода. Мне пришлось добавить «to», чтобы решить приведенный ниже пример синтаксической ошибки. Теперь я получаю новую ошибку «# 1054 — Неизвестный столбец ‘comment_ID’ в ‘списке полей»». Вы сталкивались с этим раньше? RENAME TABLE wp_comments to wp_comments_not_deduped; RENAME TABLE wp_comments_deduped to wp_comments;

2. Дох! Я забыл «КОМУ», и я также забыл FROM wp_comments в своем втором предложенном запросе.

Ответ №2:

Я бы рекомендовал добавить уникальный ключ в таблицу, сделать его автоматически инкрементным tempId , чтобы вы могли различать один повторяющийся набор, использовать приведенный ниже запрос для удаления дубликатов копий и в конце удалить этот столбец «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`
        )
  

Комментарии:

1. Я получаю это сообщение об ошибке «#1054 — Неизвестный столбец ‘dups.comment_ID’ в предложении ‘having'»

2. @EsmondMccain исправил запрос, не тестировал его, в нем может быть какая-то синтаксическая ошибка, но вы поняли идею, однако теперь она должна работать

Ответ №3:

Я не совсем понимаю, почему, по-видимому, существуют два разных поля с именем ‘column_ID’ из одной и той же таблицы, но я считаю, что это приведет к удалению только первой из двух идентичных записей. Однако перед выполнением инструкции DELETE обязательно сделайте резервную копию исходной таблицы.

 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
)