【问题标题】:Mysql delete similar post : can't specify target table 'wp_posts' for update in FROM clauseMysql 删除类似帖子:无法在 FROM 子句中指定目标表 'wp_posts' 进行更新
【发布时间】:2012-12-27 08:36:13
【问题描述】:

导入错误后,我的帖子中有很多重复的内容。

然后,我尝试使用该查询删除此帖子:

DELETE 
FROM wp_posts USING wp_posts
LEFT JOIN wp_postmeta pm ON wp_posts.ID = pm.post_id 
AND pm.meta_key="_wpbdp[fields][6]"
LEFT JOIN wp_wpbdp_listing_fees wlf ON wp_posts.ID = wlf.listing_id 
WHERE wp_posts.post_type="wpbdp_listing"
AND wp_posts.post_status="publish"
AND EXISTS (
    SELECT NULL
    FROM wp_posts p2
    LEFT JOIN wp_postmeta pm2 ON p2.ID = pm2.post_id 
    AND pm2.meta_key="_wpbdp[fields][6]"
    LEFT JOIN wp_wpbdp_listing_fees wlf2 ON p2.ID = wlf2.listing_id 
    WHERE p2.post_type="wpbdp_listing" 
    AND pm2.meta_value=pm.meta_value
    AND p2.post_status="publish"
    AND wlf2.category_id=wlf.category_id
)

不幸的是,我不能执行SELECT 语句来调用我要删除的同一个表。 还有其他解决方案吗?

【问题讨论】:

  • 你有什么ID之类的吗?如果是这样,请选择获取重复的 ID,将其存储在一个数组中,然后再次尝试删除这些 ID。或者:你如何确定一行是“重复的”?一个“唯一”键可能会很好地解决您的问题。
  • 你可以在那里阅读stackoverflow.com/questions/4685173/…
  • 我认为您需要编写一个脚本并运行多个查询来清理您的数据库。
  • 是的,我可以按 ID 排序,但没有重复的 ID。发现重复内容的唯一方法是检查 wp_postmeta 如果帖子具有相同的城市 (_wpbdp[fields][6]) 和相同的类别 (wp_wpbdp_listing_fees.category_id)。然后,我检查了你的链接@ATaylor,我不知道如何继续......你能帮我吗? ^^
  • 我没有发布任何链接,真的。那是“尼克”。无论如何,如何运行(伪代码):ALTER IGNORE TABLE ADD UNIQUE (city, category); 这将为您的表添加一个“唯一索引”(请查看文档中的Alter Table 以获取确切的查询并删除所有重复项。

标签: mysql sql join subquery


【解决方案1】:

我尝试了一些新的东西,它通过了。 按照@Nick 的想法,我做了那个查询:

DELETE p
FROM wp_posts p, wp_posts p2
WHERE p.post_title = p2.post_title
AND p.post_type="wpbdp_listing" 
AND p2.post_type="wpbdp_listing" 
AND p2.post_status="publish"
AND p.post_status="publish"
AND EXISTS(
    SELECT NULL
    FROM wp_wpbdp_listing_fees wlf 
    WHERE p.ID = wlf.listing_id
    AND EXISTS (
        SELECT NULL
        FROM wp_wpbdp_listing_fees wlf2 
        WHERE wlf2.category_id = wlf.category_id
        AND p.ID = wlf2.listing_id
    )
)
AND EXISTS(
    SELECT NULL
    FROM wp_postmeta pm 
    WHERE p.ID = pm.post_id
    AND pm.meta_key="_wpbdp[fields][6]"
    AND EXISTS (
        SELECT NULL
        FROM wp_postmeta pm2 
        WHERE pm2.meta_key="_wpbdp[fields][6]"
        AND p.ID = pm2.post_id
        AND pm2.meta_value=pm.meta_value
    )
)
AND p.ID < p2.ID

它非常丑陋且没有优化,但它可以工作!

顺便说一句,谢谢你的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2012-03-06
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多