从表中获取多行,其中column = array

时间:2017-11-22 13:01:24

标签: mysql

这是我之前提出的问题的修改问题,因为我不认为我的问题是正确的。

我正在NodeJS中创建一个聊天室,为了做到这一点,我有下表列出了每个房间中的用户:

+----+--------+--------+--+
| id | roomID | userID |  |
+----+--------+--------+--+
|  1 |      9 |      3 |  |
|  2 |      9 |   4786 |  |
|  3 |      9 |   7991 |  |
|  4 |      7 |      3 |  |
|  5 |      7 |   4786 |  |
|  6 |      1 |      3 |  |
+----+--------+--------+--+

我需要能够从列表中选择一组用户的roomID。所以,我想说,我想获得用户47863正在使用的房间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,仅限这些用户。如果他们参与其他会议室并不重要。

我希望自己能让自己更容易理解。

1 个答案:

答案 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`)