使用SQL删除具有相同元键值的重复帖子

时间:2014-11-01 00:21:28

标签: sql wordpress

我想将功能添加到以下代码中,以便它还删除具有相同元键值的帖子。换句话说,有一个元键' source_link'我想删除' source_link'中具有相同值的重复项。 这是当前的代码:

$wpdb->query("
    DELETE double_posts.*
    FROM $wpdb->posts as double_posts
    INNER JOIN (
    SELECT post_title, MIN(id) as min_id
    FROM $wpdb->posts
    WHERE (post_status = 'publish'
    AND post_type = 'post')
    OR (post_status = 'published'
    AND post_type = 'post')
    GROUP BY post_title
    HAVING COUNT(*) > 1
    ) AS orig_posts ON orig_posts.post_title = double_posts.post_title
    AND orig_posts.min_id <> double_posts.id
    ");

目前,jsut会删除帖子标题重复的帖子。我想保留它,然后通过重复的元键值添加删除。这里的任何帮助都会很棒!感谢。

1 个答案:

答案 0 :(得分:0)

您的内部查询仅获取MIN(id),这意味着您的删除中只会包含可能有多个重复项中的一个。还有几种方法 - 如果你想强制执行它,你可以考虑一个数据库唯一键索引。

确保在运行这些查询之前备份数据库,以防出现问题。

要按post_title删除所有重复项:

DELETE p1 
FROM 
    {$wpdb->posts} p1, 
    {$wpdb->posts} p2 
WHERE 
    p1.ID > p2.ID 
    AND p1.post_title = p2.post_title

按重复meta_key删除所有帖子:

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = 'source_link' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value