为什么SQL条件与“OR”子句不匹配?

时间:2011-08-22 23:17:02

标签: mysql sql

我不知道还能在哪里问。我有这个问题:

SELECT po.* FROM posts po, follows f, user pn
                  WHERE (f.follower_id = #{id}
                    AND f.followed_id = pn.id
                    AND po.user_id = pn.id)
                    OR (po.user_id = #{id})
                  ORDER BY created_at DESC LIMIT 10 OFFSET #{offset}

我正确地从关注者那里得到帖子,但不是用户自己的帖子。似乎OR的第二部分总是被忽略。

SELECT * FROM posts WHERE user_id = #{id}

但工作正常。

修改

对不起,我在完成文字之前不小心点击了进入!!

编辑2

现在似乎有效:

SELECT DISTINCT po.* FROM users pn
                    INNER JOIN follows f ON f.follower_id = #{id}
                    INNER JOIN posts po ON po.user_id = f.followed_id OR po.user_id = #{id}
                  ORDER BY created_at DESC LIMIT 10 OFFSET #{offset}

也许有人可以告诉我为什么?

2 个答案:

答案 0 :(得分:4)

试试这个:

SELECT po.* FROM posts po, follows f, user pn
  WHERE f.follower_id = #{id}
    AND f.followed_id = pn.id
    AND (   po.user_id = pn.id
         OR po.user_id = #{id})
  ORDER BY created_at DESC LIMIT 10 OFFSET #{offset}

在第二种情况下没有考虑隐式连接。这是我回避隐式连接的原因之一,而是使用显式INNER JOIN子句。

如果这不能得到你想要的结果,你可能需要考虑UNION。您的描述有点模糊,并且您没有向我们提供您的架构,因此我无法判断此查询是否有效。

答案 1 :(得分:2)

SELECT po.* FROM posts po, follows f, user pn
WHERE f.follower_id = #{id} AND 
      f.followed_id = pn.id AND 
      (po.user_id = pn.id OR po.user_id = #{id})
ORDER BY created_at DESC LIMIT 10 OFFSET #{offset}

试试这个。我认为括号是假的。