我正在开发消息系统。
基本上我有 2 个表,对话表仅保留 ID,关系表保留对话 ID 和对话中的用户 ID。
我的关系表;
|----------------|--------|
| CONVERSATIONID | USERID |
|----------------|--------|
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 4 | 3 |
| 4 | 1 |
| 4 | 2 |
|----------------|--------|
当用户想要发送新消息时,我正在检查用户之间是否存在对话。例如,用户 (id 1) 选择 userid 2 发送消息,但他们已经有对话并需要向此对话添加消息。
所以,我的问题是我无法在一个查询中获取存在的对话 ID。
我可以通过此查询获得属于用户的对话 ID;
SELECT DISTINCT CONVERSATIONID FROM RELATIONS
WHERE CONVERSATIONID IN
(
SELECT DISTINCT CONVERSATIONID FROM RELATIONS WHERE USERID IN ( 1,2 )
)
result : 1,2,3,4
如果我运行这个查询;
SELECT DISTINCT CONVERSATIONID FROM RELATIONS
WHERE CONVERSATIONID IN
(
SELECT DISTINCT CONVERSATIONID FROM RELATIONS WHERE USERID IN ( 1,2 )
)
AND USERID NOT IN ( 1,2 )
result : 2,3,4
但我需要“id : 1”,这是这些用户的对话。
如何通过一次查询获取此 ID?
谢谢
最佳答案
这个问题叫做关系划分
假设 UserID
对于每个 CONVERSATIONID
都是唯一的,
SELECT CONVERSATIONID
FROM conversationTable a
WHERE UserID IN (1, 2) AND -- <<== list of UserID you want to find
EXISTS
(
SELECT 1
FROM conversationTable b
WHERE a.CONVERSATIONID = b.CONVERSATIONID
GROUP BY CONVERSATIONID
HAVING COUNT(*) = 2 -- <<== number of userID on the list
)
GROUP BY CONVERSATIONID
HAVING COUNT(*) = 2 -- <<== number of userID on the list
关于mysql - 生成查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478226/