如何按每个设备的用户选择最后一条消息

olmpazwi  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(296)

我处理这个问题已经有很长一段时间没有解决办法了。
我有这张table:

user_id |  device | message |            timestamp 
|---------|---------|---------|----------------------|
|       1 | android |      hi | 2018-06-01T00:00:00Z |
|       1 |     ios |   hello | 2018-06-02T00:00:00Z |
|       1 | android |     hey | 2018-06-03T00:00:00Z |
|       2 | android |  asdasd | 2018-06-14T00:00:00Z |
|       3 | android |    good | 2018-06-03T00:00:00Z |
|       3 |     ios |   great | 2018-06-04T00:00:00Z |
|       3 |     ios | awesome | 2018-06-11T00:00:00Z |
|       4 |     ios |     yes | 2018-06-02T00:00:00Z |
|       4 |     ios |    yeah | 2018-06-03T00:00:00Z |
|       5 |     ios |      no | 2018-06-22T00:00:00Z |
|       5 | android |     nah | 2018-06-23T00:00:00Z |

如何按用户获取每个设备的最后一条消息?
因此,对于用户3,我将得到:

|       3 | android |    good | 2018-06-03T00:00:00Z |
|       3 |     ios | awesome | 2018-06-11T00:00:00Z |
bksxznpy

bksxznpy1#

您应该使用相关的子查询编写:

select t.*
from t
where t.user_id = 3 and
      t.timestamp = (select max(t2.timestamp)
                     from t t2
                     where t2.user_id = t.user_id and
                           t2.device = t.device
                    );

对于这个查询,您需要一个索引 (user_id, device, timestamp) .
性能应该比 group by 版本,因为没有聚合整个表。

ugmeyewa

ugmeyewa2#

只需按时间戳对desc中的表进行排序,并按用户id和设备对其进行分组。

select * from (
select * from Table t order by timestamp desc)a 
group by user_id, device ;
j2cgzkjk

j2cgzkjk3#

您需要编写一个子查询来获取
max timestampuser_id 以及 device 然后 self join ```
SELECT t1.user_id,t1.device,t1.message,t.timestamp
FROM (
SELECT user_id,device,max(timestamp) timestamp
FROM T
GROUP BY user_id,device
) t INNER JOIN T t1 on t.user_id = t1.user_id AND t.timestamp = t1.timestamp
WHERE t1.user_id = 3

sqlfiddle公司
结果
user_iddevicemessagetimestamp
3androidgood2018-06-03T00:00:00Z
3iosawesome2018-06-11T00:00:00Z

相关问题