#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
Комментарии:
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
)