我不知道还能在哪里问。我有这个问题:
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}
也许有人可以告诉我为什么?
答案 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}
试试这个。我认为括号是假的。