前段时间因为业务开发需要,需要查询表中所有用户的某一天的多次打卡记录中的最早或者最晚打卡记录,
需求很好理解,也比较好实现,最开始的想法就是先对用户分组,然后按照时间排序,倒序或顺序得到所求
sql如下:
SELECT * FROM A AS a WHERE a.day=TO_DAYS(?1) GROUP BY a.userId ORDER BY a.day DESC
然后发现结果并没有这么简单,
这样确实可以得到分组的结果,但是始终只会得到时间最早的那一条,无论你是顺序还是倒序,说明它时间排序是无效的
没办法,只得麻烦点,新增一个子查询,先对它排序,再对它分组
sql如下:
SELECT a.* FROM (SELECT * FROM A WHERE TO_DAYS(TIME)=TO_DAYS('2020-06-28') ORDER BY TIME ASC ) AS a GROUP BY a.user_id
发现虽然排序了,但是获得结果还是和上面一样,始终只能获得最早的那一条
后面百度多发查找才知道,mysql 5.7版本中,这样分组在排序的,需要增加limit才行,没办法,最终实现方式:
sql如下:
SELECT a.* FROM (SELECT * FROM A WHERE TO_DAYS(TIME)=TO_DAYS('2020-06-28') ORDER BY TIME ASC LIMIT 1000000) AS a GROUP BY a.user_id
虽然问题不是很复杂,但是也踩了几次坑,记录下