MySQL中在同一行显示上一条和下一条日期值的实现方法
解决MySQL查询中显示上一条记录日期的问题
嘿,我来帮你搞定这个需求!你想要在同一行里同时展示当前更新的日期和上一条的更新日期,核心是要基于intUpdateOrder的顺序来关联前后记录对吧?你的原查询用了GROUP_CONCAT,这其实不太适合这个场景,咱们换个更精准的方法:
方案1:MySQL 8.0+ 用窗口函数 LAG()
从MySQL 8.0开始支持窗口函数,LAG()可以直接获取同一分组中前一行的数据,完美匹配你的需求。这里我们按intUpdateOrder的顺序来排序,获取前一条的dateLeave作为上一条日期:
SELECT intDateId, dateLeave AS dateCurrentUpdate, -- 获取按intUpdateOrder排序的前一行的dateLeave LAG(dateLeave) OVER (ORDER BY intUpdateOrder) AS datePrevious, intUpdateOrder FROM leave_date WHERE intUpdateOrder IS NOT NULL -- 只筛选有更新顺序的记录,根据需求可调整 ORDER BY intUpdateOrder;
执行结果:
| intDateId | dateCurrentUpdate | datePrevious | intUpdateOrder |
|---|---|---|---|
| 3 | 2018-04-11 | NULL | 1 |
| 4 | 2018-04-20 | 2018-04-11 | 2 |
解释:LAG()函数会按照ORDER BY intUpdateOrder的顺序,为每一行返回前一行的dateLeave值,第一行因为没有前一行,所以datePrevious是NULL。
方案2:MySQL 5.x 版本(无窗口函数)
如果你的MySQL版本低于8.0,不支持窗口函数,可以用自连接的方式来实现:
SELECT t1.intDateId, t1.dateLeave AS dateCurrentUpdate, t2.dateLeave AS datePrevious, t1.intUpdateOrder FROM leave_date t1 LEFT JOIN leave_date t2 ON t1.intUpdateOrder = t2.intUpdateOrder + 1 WHERE t1.intUpdateOrder IS NOT NULL ORDER BY t1.intUpdateOrder;
这个思路是把表自己和自己关联,让当前行的intUpdateOrder等于上一行的intUpdateOrder +1,从而匹配到前一条记录。执行结果和上面的方案1完全一致。
关于初始记录(intUpdateOrder为NULL)
如果需要把那些intUpdateOrder为NULL的初始记录也包含进来,只需要去掉WHERE条件即可,不过这些记录因为没有更新顺序,datePrevious会是NULL,这符合逻辑。
内容的提问来源于stack exchange,提问作者Andhika R.K.
相关产品推荐
相关产品推荐

