根据ship_id分组,然后根据sta_time排序,取最新的一条数据
select *
from
s_mon_ship_biz
where
id in (
select
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY STA_TIME desc),',',1)
from
s_mon_ship_biz
GROUP BY SHIP_ID
)
ORDER BY STA_TIME desc
解释:
通过group_concat函数
先将数据按照日期倒序排序(日期最新的在最前面),然后在group,这样每个分类的第一条肯定是日期最新的。
substring_index函数
substring_index(str,delim,count),str:要处理的字符串、delim:分隔符、count:计数
例子:
SELECT SUBSTRING_INDEX('www.test.com','.',1);
结果是:www
SELECT SUBSTRING_INDEX('www.test.com','.',2)
结果是:www.test
SELECT SUBSTRING_INDEX('www.test.com','.',-2);
结果为:test.com
也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容,相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容。
小总结
GROUP_CONCAT将group by 后的id排序后连接起来,SUBSTRING_INDEX取得每行(每个分类)的第一个。
存在的问题:这种方案存在一个问题就是 MAX(created_at) AS created_at 可能会精度受损,若一在同一时间存在大批量可能会存在问题。
来源:CSDN
作者:Walker_zmc
链接:https://blog.csdn.net/Walker_zmc/article/details/103475908