【问题标题】:php mysql left join where clause errorphp mysql left join where 子句错误
【发布时间】:2011-06-04 22:32:35
【问题描述】:

有以下表格

帖子

  • 身份证
  • post_id
  • user_id

cmets

  • 身份证
  • post_id
  • comment_id
  • user_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'

这不起作用...

【问题讨论】:

  • 尝试使用AND 而不是&&
  • 如果deleted=0 表示已删除的评论,那么这将显示所有已删除的帖子-已删除的cmets 组合。
  • 返回 0,这不是结果。编辑:那我怎样才能让它做我想做的事?
  • @fxuser:0 是什么意思?删了还是没删?
  • 0 表示未删除 -- ps : 该死的午夜了,我什至不能正确写...

标签: mysql join


【解决方案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 - 根据需要更改 on 子句

【讨论】:

  • 仍然计算已删除的 cmets 或帖子。如果我删除其中一个连接,它将显示 cmets 或回复中的正确数据,但它们都不起作用...
【解决方案2】:

一个帖子可能有 cmets 也可能没有。使用LEFT JOIN 而不是INNER JOIN

帖子可能有回复,也可能没有。在该联接中也使用LEFT JOIN 而不是INNER JOIN

当使用LEFT JOIN 时,像WHERE comments.deleted = 0 这样的条件包含一个字段(来自右表(comments)的左连接),左连接被取消。所以,我们应该把这个条件放在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 个 cmets 和 3 个回复,则将返回 12 行 (3x4)。这可能是不想要的。以下第二次尝试没有这样的问题。

我没有在表格中看到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 代表发帖、评论、回复。

【讨论】:

  • 我尝试了选择查询,但它仍然计算已删除的 cmets(值为 1)
  • @fxuser:你想统计 cmets 和回复吗?还是给他们看?
  • 我要离开它。我要显示已删除的项目并仅显示一条消息。
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 2021-02-15
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2014-05-25
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多