2016-11-20 59 views
2

DB-设计聊天:获取chat_id从包含specifc用户

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

我想确定chat_id,2个特定用户所属。 user_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的。

回答

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 

这将返回所有的chat_id有两个用户25和28。但是,其他用户也可能在场。如果你只想要聊天内容的完全包含这两个用户(如私人聊天),那么你可以添加一个附加项,以您的HAVING条款:

HAVING SUM(CASE WHEN F_user_id <> 25 AND F_user_id <> 28 THEN 1 ELSE 0 END) = 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;