mysql - 生成查询

标签 mysql sql

我正在开发消息系统。

基本上我有 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/

相关文章:

mysql - 在 SQL 查询中分组

php curl 获取 mysql 数据 - 只返回一行

MySQL 关于排序大小和效率

mysql - mysql中使用concat创建复合索引

php - 无法使用 PHP 使 SQL 更新工作

sql - 如何在不删除子表的情况下删除 PostgreSQL 中的表

SQL 从查询中的数据中选择该数据不在数据库中的数据?

sql - SQL:如何将数据插入具有列名称的表中

php - Mysql 在插入时抛出错误

sql - 除 INTO 或 VALUES 子句外,不能使用组项