我有一个名为conversation_user
的表,其中包含users
和conversations
之间的关系(基本上它存储了参与对话的用户)。
这就是它的样子:
----------------------------
| 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|
---------------
答案 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
是您要查找的参与者数量。