Sql 如何编写连接三个表的嵌套查询?

Sql 如何编写连接三个表的嵌套查询?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在创建一个类似社交网络的网站。我有三张桌子。我正在查找每个用户及其好友总数和被阻止的好友数 1. tbl_Registrations | Id | FirstName | ************************* 1 User1 2 User2 3 User3 4 User4 5 User5

我正在创建一个类似社交网络的网站。我有三张桌子。我正在查找每个用户及其好友总数和被阻止的好友数

    1. tbl_Registrations

    |   Id  |   FirstName   |
    *************************
        1       User1   
        2       User2
        3       User3   
        4       User4
        5       User5
        6       User6
        7       User7
        8       User8


    2.tbl_Friends

    |   Id  |   SenderId    |   ReciverId   |  Status   |

        1           1               2          Accept
        2           3               1          Accept
        3           4               1          Accept
        4           2               3          Accept
        5           3               8          Accept
        6           4               2          Accept  
        7           4               3          Accept
        8           8               4          Accept

  3. tbl_Status

   |    Id  |   UserId  |   Status  |

        1         1         Blocked
        2         3         Blocked
        3         4         Allowed
        4         2         Blocked
        5         6         Blocked
        6         5         Allowed
        7         8         Blocked
        8         7         Allowed
我的问题是

SELECT tbl_Registrations.FirstName, COUNT(*) AS TotalFriends
FROM tbl_Friends INNER JOIN tbl_Registrations ON tbl_Friends.SenderId = tbl_Registrations.Id 
OR tbl_Friends.ReciverId = tbl_Registrations.Id
WHERE (tbl_Friends.Status = 'Accept')
GROUP BY tbl_Registrations.FirstName
使用我的查询,我将只得到姓名和好友总数。如何在同一查询中包含被阻止好友的查找计数

我的预期产出是

|    FirstName   |  TotalFriendsCount   |    BlockedFriendsCount   |
试试这个

 SELECT tbl_Registrations.FirstName, 
        COUNT(*) AS TotalFriends,
        (   SELECT COUNT(*) FROM tbl_Status
            WHERE [Status]  = 'Blocked'
                AND (UserId = tbl_Friends.SenderId
                    OR UserId = tbl_Friends.ReciverId)
                AND UserId <> tbl_Registrations.id ) BlockedFriendsCount
FROM tbl_Friends 
INNER JOIN tbl_Registrations ON tbl_Friends.SenderId = tbl_Registrations.Id 
    OR tbl_Friends.ReciverId = tbl_Registrations.Id
WHERE (tbl_Friends.Status = 'Accept')
GROUP BY tbl_Registrations.FirstName

你的tbl_状态对我来说没有意义,你怎么知道用户ID 1被阻止了?他被谁阻止了?被管理员阻止了。我在做行政部分。在管理端,我列出了用户列表和他们的好友数以及被阻止的好友数@Veljko89,所以你想说tbl_friends.Status可以被“阻止”吗?我只是不知道哪一列显示的是BlockedFriends。BL_Friends.Status表示好友请求是否被接受,tbl_Status.Status表示用户是否被阻止@Veljko89不标记未涉及的产品。。。您在这里使用的是MySQL还是MS SQL Server?我收到错误消息:列tbl_Friends.SenderId在选择列表中无效,因为它未包含在聚合函数或group by子句中。列tbl_Friends.ReciverId在选择列表中无效,因为它未包含在聚合函数或group by子句中。列tbl_Registrations.Id在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group by子句中。@Abdul Rasheed