表的结构大概是这样,需求是,根据creat_time进行倒序排序,然后根据parking_space_id分组取出数据。
写出来的sql
SELECT
d.*
FROM
( SELECT * FROM demo ORDER BY create_time DESC ) d
GROUP BY
d.parking_space_id
执行出来的结果却不是我们想要的数据:
因为我们想要 parking_space_id为5的数据应该是create_time最新的一条,但是查询出来的却不是。
于是查询了网络,改进了sql,加入了limit
SELECT
d.*
FROM
( SELECT * FROM demo ORDER BY create_time DESC LIMIT 99999999 ) d
GROUP BY
d.parking_space_id
具体原因我没有整明白,执行了explain 执行计划,我发现不同的地方是select_type
其实我还是不是很明白,网上浏览资料,给出了一些解释,所以通过加入limit来告诉需要排序。
5.7以后对排序的sql解析做了优化,子查询中的排序是会被忽略的
5.6你这样写是没问题的,5.7的话需要换一换了,使用聚合函数取出你要的记录再关联原表获取第一条记录
或者使用组内排序生成行号后再按行号取第一条也行
方法二:
利用多表关联,同一纬度(id)下的create_time进行比较,得出最近的时间:
SELECT
d1.*
FROM
demo d1
WHERE
( SELECT count( 1 ) FROM demo d2 WHERE d2.parking_space_id = d1.parking_space_id AND d1.create_time <= d2.create_time ) <= 1
ORDER BY
create_time DESC