从包含特定用户的聊天中获取chat_id

时间:2016-11-20 11:14:27

标签: mysql sql database select database-design

DB-设计:

https://i.stack.imgur.com/ynByR.png

我想确定某些用户所属的chat_iduser_id已知。例如,用户25和用户28属于chat_id 1。这些也属于与chat_id 2的群聊。但是,应确定chat_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]

然而,当我指定了两个不存在的chat_id 1时,我也获得了user_id

2 个答案:

答案 0 :(得分:0)

您的尝试看起来并不遥远,但每个用户的检查需要在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

这将返回具有用户25和28的每个chat_id。但是,也可以存在其他用户。如果您只想要完全包含这两个用户的聊天(例如私人聊天),那么您可以在HAVING子句中添加一个额外的术语:

HAVING SUM(CASE WHEN F_user_id <> 25 AND F_user_id <> 28 THEN 1 ELSE 0 END) = 0

答案 1 :(得分: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;