繁体   English   中英

消息表中的复杂SQL选择查询

[英]Complex SQL select query in messages table

我在SQL中有下表称为消息。 在此处输入图片说明

如您所见,有2个对话。第一个对话在用户1和2之间,第二个对话在用户1和3之间。我想创建一个sql查询,它将返回用户1的每个对话的最后一条消息。例如,它将返回2行。第一行将包含消息“我很好!”。 第二行显示消息“ Hello,user 3”。谢谢!

一种选择是使用最小/最大技巧将涉及相同两个用户的对话分组在一起,而不管每个用户可能在哪一边。 下面的子查询查找每对用户的最新消息时间。 然后,我们加入到您的原始表中以引入实际的消息内容。

SELECT *
FROM yourTable t1
INNER JOIN
(
    SELECT
        LEAST(sessionusrID, pickedusrID) AS user_1,
        GREATEST(sessionusrID, pickedusrID) AS user_2,
        MAX(Post_time) AS latest
    FROM yourTable
    GROUP BY
        LEAST(sessionusrID, pickedusrID),
        GREATEST(sessionusrID, pickedusrID)
) t2
    ON LEAST(t1.sessionusrID, t1.pickedusrID) = t2.user_1 AND
       GREATEST(t1.sessionusrID, t1.pickedusrID) = t2.user_2 AND
       t1.Post_time = t2.latest;

在此处输入图片说明

演示

请注意,在演示中,我对您的示例数据进行了一些更改,以使“ I'm fine消息成为最新日期。 对于用户1/2会话,您有两个记录,并且消息时间相同,因此,每个预期输出都没有明确的最新消息。

如果可以接受两行,我将这样做:

(select m.*
 from messages m
 where 1 in (sessionusrID, pickedusrID)
 order by m.post_time asc
 limit 1
) union all
(select m.*
 from messages m
 where 1 in (sessionusrID, pickedusrID)
 order by m.post_time desc
 limit 1
);

如果要一行包含两列,请使用子查询,例如:

select first.*, last.*
from (select m.*
      from messages m
      where 1 in (sessionusrID, pickedusrID)
      order by m.post_time asc
      limit 1
     ) first cross join
     (select m.*
      from messages m
      where 1 in (sessionusrID, pickedusrID)
      order by m.post_time desc
      limit 1
     ) last

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM