2011-08-20 91 views
3

我有以下MySQL查询,我正在使用PHP(5.2)。DELETE FROM查询JOIN不工作?

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错误,所以我会假设语法正常?),我已经检查了DB和所存在的删除的主题(deleted列设置为1)和他们的帖子也存在这些主题(所以不是没有数据的情况)。

感谢所有回复。

+0

尝试用'SELECT'替换'DELETE',看看你是否得到你想要删除的行。 – Vache

+0

@Vache,我刚刚尝试过,并且它什么也没有返回,然后我尝试删除user_points部分,它返回了帖子的行,看到的点不存在我认为这是问题,是他们的任何方式检查它是否存在于查询中? – newbtophp

回答

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 

我希望帮助!

+0

+1击中我35秒。 –