首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择查询多个聊天系统

选择查询多个聊天系统
EN

Stack Overflow用户
提问于 2013-10-02 04:50:26
回答 2查看 508关注 0票数 0

我正在制作一个类似于facebook的聊天系统,你可以在同一时间与2到3个人交谈。我的问题是选择对话。

inbox_conversation (此表用于在用户第一次开始交谈时创建新的会话id )

代码语言:javascript
复制
id_conversation | occured_at
       1           13482942
       2           18583953

inbox_join (对话中用户加入的表,在本例中,讨论中有用户1、2、3,id为1)

代码语言:javascript
复制
id_conversation | id_user
      1            1
      1            2
      1            3
      2            4
      2            5

inbox_msg (发送消息记录表)

代码语言:javascript
复制
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的讨论

代码语言:javascript
复制
id_user | message | occured_at
 1         Hey       1457694
 2         Hola      3848374
 3         Cool      3294933

PS:如果对话有3个用户,而我只选择其中的2个,我就看不到对话了。

如果我只有用户1,2的id,在这种情况下,没有与2个用户的讨论,但是如果用户1写到数据库中的用户2将是另一个id讨论,并将与两个用户相关。就像这样,如果我添加另一个用户,例如用户3,他就看不到之前在用户1和用户2之间发送的消息

如果只选择id用户是一个不好的主意,我可以研究一些解决方案来传递讨论的id。

EN

回答 2

Stack Overflow用户

发布于 2013-10-02 06:46:11

好吧,我确实想出了一种称为“数据集比较”的逻辑,即对多行的多个数据集进行比较,并需要找出它们中是否有匹配的。

这个查询的基点是,在搜索期间,我们需要确保我们找到的会话在值和计数上具有完全相同的用户。(nothing more+nothing less+same value)

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 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 ('',“)”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19125673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档