如果你只有永远需要有多个用户的房间,那么这将工作:
SELECT DISTINCT RoomID
FROM RoomUser r1
INNER JOIN RoomUser r2
ON r1.RoomID = r2.RoomID
AND r1.RoomUserID != r2.RoomUserID
如果您需要包含x个用户的房间的房间ID,则使用Having
子句,这比自己加入的子项更具可扩展性。如果你需要找房的ID有3个或更多的用户ID,那么你最终会得到:
SELECT RoomID
FROM RoomUser
GROUP BY RoomID
HAVING COUNT(DISTINCT UserID) > 3
而使用自联接,而可能更有效地将结束与一些相当混乱SQL。检查执行计划并运行一些测试,以查看哪些更适合您的需求。
如果你确实需要在房间的用户的用户ID与多个用户ID,那么你可以使用一个CTE建立一个逗号分隔的用户的字符串中的每个房间:
;WITH RoomUserCTE AS
( SELECT RoomID,
MIN(UserID) [UserID],
CONVERT(VARCHAR(20), MIN(UserID)) [Users],
0 [Recursion]
FROM RoomUser
GROUP BY RoomID
UNION ALL
SELECT a.RoomID,
b.UserID [UserID],
CONVERT(VARCHAR(20), Users + ', ' + CONVERT(VARCHAR, b.UserID)),
Recursion + 1
FROM RoomUserCTE a
INNER JOIN RoomUser b
ON a.RoomID = b.RoomID
AND b.UserID > a.UserID
)
SELECT RoomID, Users
FROM ( SELECT *, MAX(Recursion) OVER(PARTITION BY RoomID) [MaxRecursion]
FROM RoomUserCTE
) cte
WHERE MaxRecursion = Recursion
对于数据在你的问题,这将产生
| RoomID | Users |
|---------+---------|
| 11 | 1, 2 |
| 12 | 1, 3 |
| 13 | 1, 4 |
这无论工作多用户ID是如何与同一房间ID相关联,因此又更向前兼容。