Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从包含特定用户的聊天室获取聊天室id_Mysql_Sql_Database_Select_Database Design - Fatal编程技术网

Mysql 从包含特定用户的聊天室获取聊天室id

Mysql 从包含特定用户的聊天室获取聊天室id,mysql,sql,database,select,database-design,Mysql,Sql,Database,Select,Database Design,数据库设计: 我想确定2个特定用户所属的聊天室id。用户id是已知的。例如,用户25和用户28属于聊天室id 1。这些也属于具有chat\u id 2的群组聊天。但是,应确定只有这两个用户拥有的聊天id。我可以使用什么SQL查询?我试过的方法如下: [SELECT chat_id FROM `chat_partners` WHERE private=1 AND (F_user_id=100 OR F_user_id=50) GROUP BY chat_id HAVING count(*)=2;

数据库设计:

我想确定2个特定用户所属的
聊天室id
用户id
是已知的。例如,用户25和用户28属于
聊天室id 1
。这些也属于具有
chat\u id 2
的群组聊天。但是,应确定只有这两个用户拥有的聊天id。我可以使用什么SQL查询?我试过的方法如下:

[SELECT chat_id FROM `chat_partners` WHERE private=1 AND (F_user_id=100 OR F_user_id=50) GROUP BY chat_id HAVING count(*)=2;][1]

然而,在那里,当我指定了两个不存在的
用户id
时,我也得到了
聊天id 1

您的尝试看起来并不遥远,但需要在
HAVING
子句中对每个用户进行检查,而不是
WHERE
子句:

SELECT chat_id
FROM chat_partners
WHERE private = 1
GROUP BY chat_id
HAVING SUM(CASE WHEN F_user_id = 25 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN F_user_id = 28 THEN 1 ELSE 0 END) > 0
HAVING SUM(CASE WHEN F_user_id <> 25 AND F_user_id <> 28 THEN 1 ELSE 0 END) = 0
这将返回每个同时有25和28个用户的
聊天id
。但是,其他用户也可能在场。如果您只希望聊天仅包含这两个用户(例如私人聊天),则可以在
HAVING
子句中添加一个附加术语:

SELECT chat_id
FROM chat_partners
WHERE private = 1
GROUP BY chat_id
HAVING SUM(CASE WHEN F_user_id = 25 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN F_user_id = 28 THEN 1 ELSE 0 END) > 0
HAVING SUM(CASE WHEN F_user_id <> 25 AND F_user_id <> 28 THEN 1 ELSE 0 END) = 0
具有总和(当F_用户id 25和F_用户id 28为1时,则为0结束)=0

如果您想要拥有这两个用户和其他用户的组,那么简单的方法是:

SELECT chat_id
FROM chat_partners
WHERE private = 1 AND
      F_user_id IN (25, 28)
GROUP BY chat_id
HAVING COUNT(*) = 2;  -- If there can be duplicates, then use `COUNT(DISTINCT F_user_id)`;
如果您想与这些用户聊天,而不想与其他用户聊天:

SELECT chat_id
FROM chat_partners
WHERE private = 1
GROUP BY chat_id
HAVING SUM(F_user_id = 25) > 0 AND SUM(F_user_id = 28) > 0;