我在寻找:
我正在寻找一个SELECT查询,允许我从每个对话中选择最后一条消息.对话由两侧具有相同用户ID的所有行组成.示例:4-2和2-4.
消息表:
ID ----- Sender_ID ----- Receiver_ID ----- body ----- timestamp
1 ------------------- 4- -------------------- 2 ----------...---------------- -...
2 ------------------- 2 --------------------- 4 --- -------... ----------------- ...
3 ------------------- 4 --------------------- 2 ----------...-------------- ---...
4 ------------------- 4 --------------------- 2- ---------... ----------------- ...
5 ----------------- --4 --------------------- 3 ----------...------------ -----...
6 ------------------- 3 --------------------- 4 ----------... ----------------- ...
结果:
ID ----- Sender_ID ----- Receiver_ID ----- body ----- timestamp
4 ------------------- 4-- ------------------- 2 ----------...----------------- ...
6 ------------------- 3 --------------------- 4 ---- ------... ----------------- ...
要从对话中获取最后一条消息,您可以使用逐个查询来获取最后一个ID(如果它总是递增)或最后一个时间戳.User_1将是ID较低的用户,user_2是具有较高ID的用户:
select
least(sender_ID, receiver_ID) as user_1,
greatest(sender_ID, receiver_ID) as user_2,
max(ID) as last_id,
max(timestamp) as last_timestamp
from
messages
group by
least(sender_ID, receiver_ID),
greatest(sender_ID, receiver_ID)
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用如下查询获取实际消息:
select m.*
from
messages m inner join (
select
least(sender_ID, receiver_ID) as user_1,
greatest(sender_ID, receiver_ID) as user_2,
max(ID) as last_id,
max(timestamp) as last_timestamp
from
messages
group by
least(sender_ID, receiver_ID),
greatest(sender_ID, receiver_ID)
) s on least(sender_id, receiver_id)=user_1
and greatest(sender_id, receiver_id)=user_2
and m.id = s.last_id -- or last timestamp
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |