[英]Complex SQL select query in messages table
一种选择是使用最小/最大技巧将涉及相同两个用户的对话分组在一起,而不管每个用户可能在哪一边。 下面的子查询查找每对用户的最新消息时间。 然后,我们加入到您的原始表中以引入实际的消息内容。
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.