Mysql 检查结果计数

Mysql 检查结果计数,mysql,sql,Mysql,Sql,我正在做一个项目,需要从我的数据库中获取帖子。我正在尝试获取用户和其他用户发布的帖子,除非它们是私有的 我的SQL查询是 SELECT . . .,COUNT(F.user_id) AS is_following FROM posts AS P INNER JOIN users AS U ON U.id = P.user_id LEFT JOIN followers AS F ON F.user_id = :userid AND F.following_id = U.id WHERE *If m

我正在做一个项目,需要从我的数据库中获取帖子。我正在尝试获取用户和其他用户发布的帖子,除非它们是私有的

我的SQL查询是

SELECT . . .,COUNT(F.user_id) AS is_following FROM posts AS P INNER JOIN users AS U ON U.id = P.user_id LEFT JOIN followers AS F ON F.user_id = :userid AND F.following_id = U.id WHERE *If matches search* AND U.private = 0 OR U.id = :userid OR is_following = 1 ORDER BY. . .
我正在选择用户跟踪海报的位置,如果0表示他们没有跟踪,则计数,如果1表示1结果,则跟踪他们。此外,我正在检查private是否为0,这意味着该帐户是公共的

问题是当我有
is_following=1
时,如果我删除它,它不会返回任何结果,尽管它确实返回结果,但不是全部

表格:

users: id|username|private|...
followers: userid|followingid
posts: id|userid|body
内容:

users: id|username|private|...
followers: userid|followingid
posts: id|userid|body
用户:

user1|test1|1 (This is the user running the request)
user2|test2|1
user3|test3|1
追随者:

user1|user2 (User searching follows test2)
职位:

post1|user1|HelloWorld
post2|user2|Hello_World
post3|user3|Hello-World

预期结果是返回post1和post2,但不是post3,因为user3是private(private设置为true/1),并且user1不遵循test3,但是它应该显示user2的post,因为user1跟在user2后面。当您有
is\u following
条件时,它不返回结果的原因是您试图在WHERE子句中使用一个别名,这是MySQL不允许的。将
后面的
替换为
计数(F.user\u id)
,应该可以工作

如果我理解正确的话

有两种类型的组

  • private为0,表示该帐户为公共帐户
  • private是1,需要在followers表中找到以下用户
  • 有一种简单的方法可以进行两个查询,一个是private为0,另一个是private为1,然后使用
    UNION ALL
    组合它们

    SELECT * FROM 
    (
      SELECT p.*
      FROM users as u 
      INNER JOIN posts AS P ON p.userid = u.id  
      WHERE u.private = 0 
      UNION ALL 
      SELECT p.*
      FROM users as u 
      INNER JOIN posts AS P ON p.userid = u.id  
      RIGHT JOIN followers AS F ON F.followingid = u.id
      WHERE u.private = 1 AND f.userid = :userid 
    )t
    
    或者使用
    exists
    检查它

    SELECT p.*
    FROM users as u 
    INNER JOIN posts AS P ON p.userid = u.id  
    WHERE u.private = 0 OR exists 
    (
        SELECT 1 
        FROM followers AS F LEFT JOIN users ON F.followingid = users.id
        WHERE u.id = users.id 
        and users.private 
        and f.userid = :userid 
    )
    
    sqlfiddle:

    编辑

    如果你想知道用户是否在
    后面
    ,你可以这样做

    然后,您可以在外部
    where
    子句中找到跟随
    的用户

    SELECT * FROM 
    (
      SELECT p.*,0 as 'is_following'
      FROM users as u 
      INNER JOIN posts AS P ON p.userid = u.id  
      WHERE u.private = 0 
      UNION ALL 
      SELECT p.*,1 
      FROM users as u 
      INNER JOIN posts AS P ON p.userid = u.id  
      RIGHT JOIN followers AS F ON F.followingid = u.id
      WHERE u.private = 1 AND f.userid = 'user1'
    )t
    /*where is_following = 1*/
    

    SQLFIDLE:

    你能给出一些示例数据和预期结果吗?@D-Shih预期结果是包含
    is_following=1的帖子
    你可以在查询中使用
    HAVING COUNT(F.user_id)=1
    。HAVING
    COUNT(F.user_id)=1
    使其仍然返回null你能提供示例数据和期望的输出来帮助调试吗?我刚刚尝试过,它仅在帖子跟随用户时显示帖子。如果用户是公共的,我想显示帖子,但如果他们是私人的,我只想在F结果为1的情况下显示帖子。如果海报是私人的,则只有用户在跟踪海报时才重要,如果海报是公共的,则应显示并忽略以下状态是否有更简单的方法将计数检查添加到我当前查询的末尾?您希望在查询中获得以下用户数量或用户总数的哪个计数?对于每个帖子的海报,假设它在post2上,它将检查user2是否是私有的,如果他们是私有的,则检查user1是否跟随他们,count is count=0表示不跟随,1表示他们跟随私有海报