这是我之前提出的问题的修改问题,因为我不认为我的问题是正确的。
我正在NodeJS中创建一个聊天室,为了做到这一点,我有下表列出了每个房间中的用户:
+----+--------+--------+--+
| id | roomID | userID | |
+----+--------+--------+--+
| 1 | 9 | 3 | |
| 2 | 9 | 4786 | |
| 3 | 9 | 7991 | |
| 4 | 7 | 3 | |
| 5 | 7 | 4786 | |
| 6 | 1 | 3 | |
+----+--------+--------+--+
我需要能够从列表中选择一组用户的roomID。所以,我想说,我想获得用户4786
和3
正在使用的房间ID,它会返回7.如果我想获得用户4786
的房间ID,{{1} }和3
正在使用,它将返回9.
好的。在我的previous question中,我得到的答案是使用7991
。我没有意识到(我不太使用IN语句)是IN语句本质上是SELECT * FROM table WHERE userID IN (4786,3,7991)
语句的快捷方式。
这引出了我的问题,我尝试的第一件事是OR
,因为它没有显式匹配表中的每个userID,结果是不可靠的。
I've created an SQLFiddle here.
我希望能够说:为这些用户提供唯一的roomID,仅限这些用户。如果他们参与其他会议室并不重要。
我希望自己能让自己更容易理解。
答案 0 :(得分:1)
<强> SQL DEMO 强>
SELECT roomId, COUNT(CASE WHEN `userID` IN (4786,3)
THEN 1
END) total_match
FROM `chat-room-users`
GROUP BY roomId
HAVING total_match = 2 -- because are 2 users in (4786,3)
AND total_match = COUNT(`userID`)
让我们假设您将用户放在表search_user
中,以使您的查询变得更通用:
SELECT roomId, COUNT(CASE WHEN `userID` IN (SELECT userID FROM search_users)
THEN 1
END) total_match
FROM `chat-room-users`
GROUP BY roomId
HAVING total_match = (SELECT COUNT(*) FROM search_users)
AND total_match = COUNT(`userID`)