MySQL选择具有公共列的行

时间:2015-05-07 14:37:24

标签: mysql sql select

我有一个名为conversation_user的表,其中包含usersconversations之间的关系(基本上它存储了参与对话的用户)。

这就是它的样子:

----------------------------
| id | conversation | user |
----------------------------
|  1 |            1 |    1 |
|  2 |            1 |    2 |
|  3 |            2 |    4 |
|  4 |            3 |    2 |
|  5 |            3 |    3 |
|  6 |            4 |    1 |
|  7 |            4 |    2 |
|  8 |            4 |    3 |
----------------------------

我想写一个查询,根据参与对话的用户的用户ID,它返回会话ID(如果有的话)。

  

示例:

     

用户ID:[1,2] =>会话ID:1
  用户ID:[2,1,3] =>会话ID:4

这是我迄今为止所能实现的目标:

SELECT conversation FROM conversation_user WHERE user IN (1, 2) GROUP BY conversation HAVING count(*) = 2

当然这个查询会返回:

---------------
| conversation|
---------------
|            1|
|            4|
---------------

2 个答案:

答案 0 :(得分:1)

group_concat聚合函数应该可以解决问题:

SELECT   `conversation`, GROUP_CONCAT(`user`) AS users
FROM     conversation_user
GROUP BY `conversation`
HAVING   COUNT(*) >= 2

答案 1 :(得分:1)

您正在寻找完全匹配。所以,(1,2)匹配对话4。

为此,您不能使用where子句进行过滤。代替:

SELECT conversation
FROM conversation_user
GROUP BY conversation
HAVING count(*) = 2 AND
       sum(user in (1, 2)) = count(*);

= 2是您要查找的参与者数量。