我有以下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
表=>中[如果创建帖子的主题已被删除(为了您的信息以避免混淆,它实际上只是“隐藏”,我们通过检查它是否等于1
)来确定。
我希望查询结构自我解释,topic_id
主要用于JOIN
表格。
查询运行正常(没有MySQL或PHP错误,所以我假设语法没问题?),我已经检查了存在的数据库和主题被删除(deleted
列已设置到1
)和他们的帖子以及那些主题的存在(所以不存在没有数据的情况)。
感谢所有回复。
答案 0 :(得分:5)
我个人倾向于始终明确指定连接,而不是将所有内容都放在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
我希望有所帮助!