选择多个聊天系统的查询

时间:2013-10-01 20:50:26

标签: mysql sql

我正在制作一个类似于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。

2 个答案:

答案 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('','','',)”