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

Mysql 为什么SQL条件语句与“OR”子句不匹配?,mysql,sql,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})

我不知道还能问什么。我有一个疑问:

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}
也许有人能告诉我为什么?

试试这个:

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}
在第二种情况下,未考虑隐式联接。这就是我避免使用隐式连接,而使用显式内部连接子句的原因之一

如果这并不能得到你正在寻找的结果,你可能需要考虑一个联合。您的描述有点模糊,而且您还没有向我们提供您的模式,因此我无法判断此查询是否有效。

请尝试以下操作:

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}
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}
在第二种情况下,未考虑隐式联接。这就是我避免使用隐式连接,而使用显式内部连接子句的原因之一

如果这并不能得到你正在寻找的结果,你可能需要考虑一个联合。您的描述有点模糊,并且您没有给我们您的模式,所以我无法判断此查询是否有效

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}
试试这个。我认为括号是假的


试试这个。我认为括号是错误的。

如果有错误,MySQL的错误输出会很有帮助。否则,我们需要知道查询做什么,以及您希望它做什么。我们看不到您的显示器,也看不懂您的心思。很抱歉,在我完成文本标记之前,我无意中按了enter键。我不知道您的Follows表与posts表的关联方式。follower表中是否同时存在userID和posid?如果是这样,posts表上的键列是什么。。。PostID或以下是实际用户ID?@DRapp:My FollowTable是两个用户之间的关联。所以follower_id和followerd_id引用用户表。posts表有一个user_id列,其中包含posting用户,我想用它来查找给定用户跟随的用户的所有帖子,以及他自己的帖子。如果有错误,MySQL的错误输出将非常有用。否则,我们需要知道查询做什么,以及您希望它做什么。我们看不到您的显示器,也看不懂您的心思。很抱歉,在我完成文本标记之前,我无意中按了enter键。我不知道您的Follows表与posts表的关联方式。follower表中是否同时存在userID和posid?如果是这样,posts表上的键列是什么。。。PostID或以下是实际用户ID?@DRapp:My FollowTable是两个用户之间的关联。所以follower_id和followerd_id引用用户表。posts表有一个列user_id,其中包含发布用户,我想用它来查找给定用户跟随的用户的所有帖子,加上他自己的帖子。上述方法不起作用,但联合可以。如果一个工会在10号限额之后完成,那么它的效率有多高?你需要什么确切的信息来告诉我为什么上述规定也不起作用?@Andriy:。。。什么一个是followeR\u id,另一个是followeR\u id。@扫描:查询的效率取决于几个因素。使用EXPLAIN查看正在生成的查询计划,并确保没有进行表扫描。上述操作不起作用,但union会起作用。如果一个工会在10号限额之后完成,那么它的效率有多高?你需要什么确切的信息来告诉我为什么上述规定也不起作用?@Andriy:。。。什么一个是followeR\u id,另一个是followeR\u id。@扫描:查询的效率取决于几个因素。使用EXPLAIN查看正在生成的查询计划,并确保没有发生表扫描。