2015-10-08 5 views
0

У меня есть множество дубликатов комментариев в моей базе данных Wordpress, в частности, таблицы wp_comments. Конечно, эти комментарии имеют разные идентификаторы. Теперь я хотел бы обмануть эти комментарии на основе поля comment_date, в котором будут указаны все комментарии, опубликованные в одни и те же дату и время. Мне все равно, какой из дубликатов останется.Удалить повторяющиеся строки в MySQL (Wordpress, комментарии)

Какой SQL-запрос я должен использовать для достижения этого?

Спасибо!

EDIT: Я не хочу удалять определенную дату комментария по таблице, вместо этого я хочу, чтобы база данных просматривала повторяющиеся даты и оставалась только с одной записью.

ответ

1

Вы можете сделать выбор всего запроса, а затем пропустить его. В то время как в цикле выполняется запрос, который удаляет что-либо одно и то же и не имеет идентификатора текущего индекса. Сначала резервное копирование.

Update:

Я предпочитаю, чтобы сохранить этот вид кода в отдельный файл в корневом каталоге.

SO создайте новый файл в корневом каталоге и вызовите его, как хотите, и затем добавьте этот код. Запустите файл ПОСЛЕ ВАШИ РЕКВИЗИРОВАТЬ ваши комментарии и комментарии в мета-таблицах.

You could do a select all query and then loop through those. While in the loop do a query that delete anything that is the same and doesn't have the ID of current index. Backup first. 

Update:

Я предпочитаю, чтобы сохранить этот вид кода в отдельный файл в корневом каталоге.

SO создайте новый файл в корневом каталоге и вызовите его, как хотите, и затем добавьте этот код. Запустите файл ПОСЛЕ ВАШИ РЕКВИЗИРОВАТЬ ваши комментарии и комментарии в мета-таблицах.

<?php 
require('./wp-load.php'); 
global $wpdb; // loads the DB object 

$comments = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."comments"); 

foreach((array)$comments as $key => $comment) 
{ 
    $id_to_check = $comment->comment_ID; // keep this comment ID 
    $get_dupes = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."comments WHERE comment_content = '".$comment->comment_content."' AND comment_ID != $id_to_check OR comment_date = '".$comment->comment_date."' AND comment_ID != '".$id_to_check."' "); 

    foreach((array)$get_dupes as $dkey => $dupe) 
    { 
     $wpdb->query("DELETE FROM ".$wpdb->prefix."commentmeta WHERE comment_id = '".$dupe->comment_ID."'"); // delete duplicate comment meta 
    } 

    $wpdb->query("DELETE FROM ".$wpdb->prefix."comments WHERE comment_ID = '".$dupe->comment_ID."'"); // delete duplicate comment 

} 
echo 'all done!' 
?> 
+0

Как бы мне это сделать? Извините, noob здесь :) – Maddrax

+0

Это дает мне ошибку: Неустранимая ошибка: вызов неопределенного метода W3_Db :: get_rows() в /delete_comments.php в строке 5. Кроме того, это выглядит как comment_content OR в comment_date? Или оба? – Maddrax

+0

Doh! Meant «get_results» обновлен выше – heathhettig

0

первого подсчета количества комментариев ...

example : SELECT COUNT(*) FROM wp_comments WHERE comment_date='blahblah'

затем сохранить результат в переменной ... например, $ COMMENT_COUNT тогда ...

DELETE FROM wp_comments WHERE comment_date='blahblah' LIMIT N

заменить N с $ COMMENT_COUNT-1

+0

ОК, я не хочу удалять определенную дату комментария по таблице, вместо этого я хочу, чтобы база данных просматривала повторяющиеся даты и оставалась только с одной записью. – Maddrax

+0

, тогда вы должны сделать массив дат. и использовать цикл foreach для итерации ... –

+0

Но это потребовало бы, чтобы я знал ВСЕ даты, которые являются дубликатами, не так ли? – Maddrax

Смежные вопросы