删除 MySQL 中的重复行(Wordpress、评论)

问题描述 投票:0回答:3

我的 Wordpress 数据库中有大量重复评论,特别是表 wp_comments。当然,这些评论有不同的ID。我现在想根据字段 comment_date 删除这些评论,该字段将识别在同一日期和时间发布的所有评论。我不在乎剩下哪一个重复项。

我必须使用什么 SQL 查询才能实现此目的?

谢谢!

编辑:我不想删除表格中的特定评论日期,而是希望数据库扫描重复的日期并仅保留一个条目。

php mysql wordpress
3个回答
1
投票

您可以执行全选查询,然后循环遍历这些查询。在循环中执行一个查询,删除任何相同且不具有当前索引 ID 的内容。先备份一下。

更新:

我更喜欢将此类代码保存在根目录下的单独文件中。

所以在根目录中创建一个新文件并将其命名为您想要的任何名称,然后添加此代码。备份您的评论和评论元表后运行该文件。

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.

更新:

我更喜欢将此类代码保存在根目录下的单独文件中。

所以在根目录中创建一个新文件并将其命名为您想要的任何名称,然后添加此代码。备份您的评论和评论元表后运行该文件。

<?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
投票

先统计评论数...

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
投票

当前热门/接受的答案删除所有重复评论;然而,当 comment_content 包含需要转义的字符串时,它会遇到麻烦。例如,“我很高兴”作为评论输入两次 - 不会被删除,因为由于评论正文中的

comment content
'
比较提前结束。
$wpdb->_real_escape
docs)有帮助。

摆弄已接受的答案,并提出以下内容。这也适用于 WP 多站点,因此它也会循环所有多站点子项。如果是针对单个站点,您可以删除第一个

$blog_ids
循环中的位并修改
$blog_id
变量。

旁注,我还建议将其添加为 WP CLI 命令来执行此工作,而不是将其嵌入到服务器上的文件中。稍微灵活一点,出现问题也可以立即停止执行。

function delete_duplicates() {
    global $wpdb;
    $blog_ids = $wpdb->get_results(
        "SELECT blog_id FROM {$wpdb->base_prefix}blogs", ARRAY_A
    );

    foreach ( $blog_ids as $blog ) :
            $blog_id = $blog['blog_id'];

            $sql = $wpdb->prepare(
                "SELECT comment_author,comment_content,comment_ID FROM {$wpdb->base_prefix}%d_comments", $blog_id
            );
            $all_comments = $wpdb->get_results( $sql );
            $duplicate_comments = [];

            if ( ! empty( $all_comments ) ) :

                foreach ( $all_comments as $key => $comment ) :
                    $comment_id     = $comment->comment_ID;
                    $comment_author = $comment->comment_author;
                    //escape comment content when fetching so it compares appropriately in the $sql prepared statement
                    $escaped_content = $wpdb->_real_escape ( $comment->comment_content );

                    // find all comments with content matching current comment content and author, except current comment ID
                    $sql = $wpdb->prepare(
                        "SELECT comment_ID FROM {$wpdb->base_prefix}%d_comments WHERE comment_content = '" . $escaped_content . "' AND comment_ID != %d AND comment_author = %s", $blog_id, $comment_id, $comment_author
                    );

                    $duplicate_comments[] = $wpdb->get_var( $sql );

                endforeach;

                // only add duplicate comment IDs once into array
                $duplicate_comments = array_unique( $duplicate_comments );

                // actually deleting comments that are duplicated
                if ( ! empty( $duplicate_comments ) ) :
                    foreach ( $duplicate_comments as $duplicate_key => $duplicate_comment ) :

                        if ( ! empty ( $duplicate_comment ) ) :
                            $table  = $wpdb->prefix . $blog_id . '_comments';
                            $delete = $wpdb->delete( $table, [ 'comment_ID' => $duplicate_comment ], [ '%d' ] );

                        endif;

                    endforeach;
                endif;
            endif;
    endforeach;
}
© www.soinside.com 2019 - 2024. All rights reserved.