我正在为应用程序用户之间的消息系统工作数据库。现在,消息传递系统的所有相关信息都基于2个表。第一个表包含有关两个用户之间对话的所有信息(包括会话ID),第二个表基本上只是有权访问对话的所有用户的列表,第三个表是所有消息的表。以下是每个表格相关部分的可视化
表1:
| convoId |
-------------
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
表2:
| convoId | userId |
------------------------
| 1 | 4 |
| 1 | 5 |
| 2 | 4 |
| 2 | 5 |
| 2 | 6 |
| 3 | 3 |
| 3 | 4 |
基本上,对话1在用户4和5之间,对话2在用户4,5和6之间。
我要做的是,当用户去发送消息时,查看该用户与他们尝试发送消息的那个(或多个)之间是否已经存在对话。因此,如果用户4试图向用户5发送消息,我希望得到convoId 1,但如果4试图向用户7发送消息,则会创建一个新对话(我已经处理了该部分)。
我可以想办法使用多个查询并循环遍历它们,但看起来有点沉重。我想知道是否有办法在一个查询中完成它(可能只是少数几个)。
由于
答案 0 :(得分:2)
尝试:
SELECT a.convoId
FROM Table2 a JOIN Table2 b
ON a.convoId = b.convoId
WHERE a.userId = 4
AND b.userId = 5
AND a.convoId IN (SELECT convoId FROM Table2
GROUP BY convoId
HAVING COUNT(DISTINCT userId) = 2);
这将在用户4和5之间返回convoId
。如果没有数据,这些用户还没有任何对话。