2011-06-04 65 views
1

用下面的表PHP MySQL的左连接的where子句错误

帖子

  • ID
  • POST_ID
  • USER_ID

评论

  • ID
  • POST_ID
  • COMMENT_ID
  • user_id说明
  • 删除

回复

  • ID
  • POST_ID
  • reply_id
  • user_id说明
  • 删除

我试图让每一个意见,并从每个post.post_id和post.user_id回复= 'x' 和评论或回复不会被删除(0)

这就是我试图

SELECT * 
FROM posts p 
LEFT JOIN comments c ON p.id=c.post_id 
LEFT JOIN replies r ON p.id=r.post_id 
WHERE p.user_id=$user_id 
&& c.deleted='0' && r.deleted='0' 

不工作...

+2

尝试使用'和'而不是''&& – 2011-06-04 22:34:56

+0

如果'删除= 0'意味着删除评论,那么这将显示所有删除帖子 - 删除评论组合。 – 2011-06-04 22:36:38

+0

返回0,这不是结果。 编辑:我怎么能让它做我想要的? – fxuser 2011-06-04 22:37:11

回答

0

一个帖子可以有意见或没有。使用LEFT JOIN而不是INNER JOIN

帖子可能有答复或不答复。在该连接中使用LEFT JOIN而不是INNER JOIN

当使用LEFT JOIN,像WHERE comments.deleted = 0的条件包括场(从左侧右表(comments)JOIN),所述左连接被取消。所以,我们应该把这个条件放在ON条款中,而不是在WHERE中。

SELECT * 
FROM posts p 
    LEFT JOIN comments c 
    ON p.post_id = c.post_id 
    AND c.deleted = 0 
    LEFT JOIN replies r 
    ON p.post_id = r.post_id 
    AND r.deleted = 0 
WHERE p.user_id = $user_id 

思路更加清晰,上面会显示这个问题介绍了什么,但例说,4条评论和3篇回复,12列将返回(3×4)。这可能不是想要的。以下第二次尝试没有这样的问题。

我没有在表格中看到post.textcomment.textreply.text,但无论如何,您都会明白。如果不合适,您可以删除3 text行。

(SELECT p.post_id  AS post_id 
     , 0    AS type 
     , p.post_id  AS id 
     , p.text  AS text 
    FROM posts p 
    WHERE p.user_id = $user_id 
) 
UNION ALL 
    (SELECT p.post_id  AS post_id 
     , 1    AS type 
     , c.comment_id AS id 
     , c.text  AS text 
    FROM posts p 
     JOIN comments c 
     ON p.post_id = c.post_id 
    WHERE p.user_id = $user_id 
     AND c.deleted = 0 
) 
UNION ALL 
    (SELECT p.post_id  AS post_id 
     , 2    AS type 
     , r.reply_id AS id 
     , r.text  AS text 
    FROM posts p 
     JOIN replies r 
     ON p.post_id = r.post_id 
    WHERE p.user_id = $user_id 
     AND r.deleted = 0 
) 
ORDER BY post_id 
     , post_type 
     , id 

0,1,2代表帖子,评论,回复。

+0

,我实际上使用LEFT。 – fxuser 2011-06-04 22:41:20

+0

我试过选择查询,但它仍然统计删除的评论(有值1) – fxuser 2011-06-04 22:47:43

+0

@fxuser:你想评论评论和回复吗?或者展示他们? – 2011-06-04 22:57:16

1

您需要将删除的检查加入联接子句。这应做到:

SELECT * 
FROM posts p 
LEFT JOIN comments c ON c.post_id = p.post_id AND NOT c.deleted 
LEFT JOIN replies r ON r.post_id = p.post_id AND NOT r.deleted 
WHERE p.user_id = $user_id 

注:不知道c.post_id加入到p.id或p.post_id - 按要求chenge on子句

+0

仍然计算删除的评论或帖子..如果我删除其中一个连接它会显示正确的数据从评论或答复,但他们都不工作... – fxuser 2011-06-04 22:58:11