【问题标题】:DELETE FROM query with JOINs not working?使用 JOIN 的 DELETE FROM 查询不起作用?
【发布时间】:2011-08-21 02:10:14
【问题描述】:

我有以下 MySQL 查询,我正在使用 PHP (5.2)。

DELETE t1.*, t3.* FROM 
            forum_posts AS t1,
            forum_topics AS t2,
            user_points AS t3
WHERE  t1.topic_id = t2.topic_id
       AND t2.deleted = 1
       AND t1.post_id = t3.id
       AND t3.type = 'post'
       AND t1.post_author = t3.profile_author  

但是它也没有按照我的预期运行(什么都没有发生!),让我解释一下:

我打算让查询执行的是删除 forum_posts 表中的所有行和/或(我说“和/或”,因为这将取决于行是否存在)删除表中的所有行user_points table => [如果创建帖子的主题已被删除(为了您的信息以避免混淆,它实际上只是“隐藏”,我们通过检查它是否等于 @987654324 来确定这一点@)]。

我希望查询结构能自行解释,topic_id 主要用于JOIN 将表放在一起。

查询运行良好(没有给出 MySQL 或 PHP 错误,所以我认为语法没问题?),我检查了数据库和存在的已删除主题(deleted 列设置为 @ 987654328@) 和他们的帖子也存在于这些主题中(因此并非没有数据)。

感谢所有回复。

【问题讨论】:

  • 尝试将DELETE 替换为SELECT,看看是否得到了要删除的行。
  • @Vache,我刚刚尝试过,它什么也没返回,然后我尝试删除 user_points 部分并返回帖子的行,因为这些点不存在我认为那是问题,他们有什么方法可以检查它是否存在于查询中?

标签: mysql join


【解决方案1】:

我个人偏好始终明确指定连接,而不是将所有内容集中在 where 子句中。这也有助于可视化您可能需要左连接的位置。

DELETE forum_posts t1, user_points t3
    FROM forum_posts AS t1
    INNER JOIN forum_topics AS t2 ON t2.topic_id = t1.topic_id
    INNER JOIN user_points AS t3 ON t3.id = t1.post_id
        AND t3.profile_author = t1.post_author
        AND t3.type = 'post'
WHERE t2.deleted = 1

现在,根据您的说法,我建议将第二个 INNER JOIN 更改为 LEFT JOIN:

DELETE forum_posts t1, user_points t3
    FROM forum_posts AS t1
    INNER JOIN forum_topics AS t2 ON t2.topic_id = t1.topic_id
    LEFT JOIN user_points AS t3 ON t3.id = t1.post_id
        AND t3.profile_author = t1.post_author
        AND t3.type = 'post'
WHERE t2.deleted = 1

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2018-09-24
    • 2018-08-21
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多