我正在制作一个类似于facebook的聊天系统,你可以在同一时间与2到3个人交谈。我的问题是选择对话。
inbox_conversation (此表用于在用户第一次开始交谈时创建新的会话id )
id_conversation | occured_at
1 13482942
2 18583953inbox_join (对话中用户加入的表,在本例中,讨论中有用户1、2、3,id为1)
id_conversation | id_user
1 1
1 2
1 3
2 4
2 5inbox_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 3294933PS:如果对话有3个用户,而我只选择其中的2个,我就看不到对话了。
如果我只有用户1,2的id,在这种情况下,没有与2个用户的讨论,但是如果用户1写到数据库中的用户2将是另一个id讨论,并将与两个用户相关。就像这样,如果我添加另一个用户,例如用户3,他就看不到之前在用户1和用户2之间发送的消息
如果只选择id用户是一个不好的主意,我可以研究一些解决方案来传递讨论的id。
发布于 2013-10-02 06:46:11
好吧,我确实想出了一种称为“数据集比较”的逻辑,即对多行的多个数据集进行比较,并需要找出它们中是否有匹配的。
这个查询的基点是,在搜索期间,我们需要确保我们找到的会话在值和计数上具有完全相同的用户。(nothing more+nothing less+same value)
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发布于 2013-10-02 05:14:24
这些问题有点不清楚,所以只需要弄清楚你到底需要什么?
在开始时,您提到了只根据ID_User查询结果。但是在最后一个例子中,你说的是"...the result is for DiscussionID 1“,那么哪一个是正确的呢?DiscussionID和ID-User是否都可用于过滤?
另外,"PS:如果对话有3个用户,而我尝试只选择其中的2个,我就看不到对话了“
平均id_User过滤器类型是"WHER ID_USER IN ('',“)”
https://stackoverflow.com/questions/19125673
复制相似问题