我处理这个问题已经有很长一段时间没有解决办法了。
我有这张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 |
3条答案
按热度按时间bksxznpy1#
您应该使用相关的子查询编写:
对于这个查询,您需要一个索引
(user_id, device, timestamp)
.性能应该比
group by
版本,因为没有聚合整个表。ugmeyewa2#
只需按时间戳对desc中的表进行排序,并按用户id和设备对其进行分组。
j2cgzkjk3#
您需要编写一个子查询来获取
max
timestamp
由user_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