我正在制作一个类似于facebook的聊天系统,您可以在同一时间与2或3个人交谈。我的问题在于选择对话。
inbox_conversation(此表用于在用户第一次开始讲话时创建新的会话ID)
id_conversation | occured_at
1 13482942
2 18583953
inbox_join(用户加入对话的表格,在这种情况下有用户1,2,3对于id为1的讨论)
id_conversation | id_user
1 1
1 2
1 3
2 4
2 5
inbox_msg(用于记录发送消息的表)
id_conversation | id_user | message | occured_at
1 1 Hey 1457694
1 2 Hola 3848374
1 3 Cool 3294933
2 4 Wow 4392934
2 5 Yes 9485737
现在我必须做一些查询来选择只有对话的id_user的消息,在这种情况下我有1,2,3。有人可以帮我构建这个查询。
我希望用id_user 1,2,3
选择讨论的最终结果id_user | message | occured_at
1 Hey 1457694
2 Hola 3848374
3 Cool 3294933
PS:如果对话有3个用户,我尝试只选择2个用户,我就能看不到对话。
如果我在这种情况下只有用户1,2的id,那么就没有与那个用户进行讨论,但是如果用户1在数据库中写入用户2将是另一个id讨论并且将与两者相关联用户。就像那样,如果我添加另一个用户示例用户3,他就看不到用户1和2之间发送的先前消息
如果是一个坏主意只选择id用户,我可以研究一些解决方案来传递讨论的ID。
答案 0 :(得分:1)
此查询的基本点是,在搜索中我们需要确保我们找到的会话具有完全相同的用户按值和按计数。 (没有更多+没有更少+相同的价值)
DECLARE @inbox_msg TABLE
(
id_conversation INT NOT NULL
,id_user INT NOT NULL
,[message] NVARCHAR(MAX) NULL
,occured_at TIMESTAMP NOT NULL
)
INSERT INTO @inbox_msg
( id_conversation ,
id_user ,
message
)
SELECT 1,1,'Hey'
UNION ALL SELECT 1,2,'Hola'
UNION ALL SELECT 1,3,'Cool'
UNION ALL SELECT 2,4,'Wow'
UNION ALL SELECT 2,5,'Yes'
--this I added to make sure 3 will not become part of your result set.
UNION ALL SELECT 3,1,'Testing'
UNION ALL SELECT 3,2,'Search'
UNION ALL SELECT 3,3,'query'
UNION ALL SELECT 3,4,'Result'
--this is the list of users you want to search for
DECLARE @searchMessgeByUser TABLE
(
id_user INT NOT NULL PRIMARY KEY
)
INSERT INTO @searchMessgeByUser ( id_user )
SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
--find out the sessionID who has exactly same number of user as participant as requested
DECLARE @MatchedSessionID TABLE
(
id_conversation INT NOT NULL
)
INSERT INTO @MatchedSessionID( id_conversation )
SELECT qry.id_conversation
FROM
(
--find out the MatchedSessionIDByUserCount
SELECT id_conversation
FROM @inbox_msg
GROUP BY id_conversation
HAVING (COUNT(DISTINCT id_user) = (SELECT COUNT(1) FROM @searchMessgeByUser) )
INTERSECT
--find out the MatchedSessionIDByUserValue
SELECT id_conversation
FROM @inbox_msg msg
JOIN @searchMessgeByUser usr
ON msg.id_user=usr.id_user
GROUP BY msg.id_conversation
)qry
--final Query
SELECT id_user,message,occured_at
FROM @inbox_msg
WHERE id_conversation IN (SELECT id_conversation FROM @MatchedSessionID)
ORDER BY occured_at
答案 1 :(得分:0)
问题有点不清楚,所以只是弄清楚你到底需要什么?
在开始时,您只是根据ID_User查询结果。 但在最后一个示例中,您说的是“......结果是针对DiscussionID 1” 那么一个是正确的吗? DiscussionID和ID-User是否都可以过滤?
此外,“PS:如果对话有3个用户,我尝试只选择其中2个,我就能看不到对话”
是指id_User过滤器的类型为“WHER ID_USER IN('','','',)”