说下业务需求:需要将特别的字段的数据提前,然后再按照创建时间倒叙排列
初看需求特别简单,秒秒钟sql就写好了:
SELECT
*
FROM
`order`
LEFT JOIN `ORDER_ERROR` orer ON `order`.`id` = orer.order_id
ORDER BY
`orer`.`need_manual_processing` DESC,
`create_time` DESC
运行了之后,完美交收。
跑了些数据,测试说了,你这个不对啊,排序有问题啊,怎么有一个刚创建的订单排到了末位,我就说,不可能的,这个sql这么简单,不可能错的,你再看看。
测试看了几遍,确定是有问题,我看了,确实。然后在数据库跑了脚本,发现确实:
这么诡异的时间怎么发生的呢?发现这个need_manual_processing为空,
看了下MySQL的文档,发现null比数字的排序靠前。这就麻烦了。没遇到过啊。
找了下谷歌然后看了下文档,找到了个:isnull方法,测试了下数据库报错,发现这个是老版本废弃的方法,现在的是ifnull:
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL() 函数语法格式为:
IFNULL(expression, alt_value)
修复下sql脚本:
SELECT
ifnull(orer.need_manual_processing ,0) as need_manual_processing,*
FROM
`order`
LEFT JOIN `ORDER_ERROR` orer ON `order`.`id` = orer.order_id
ORDER BY
ifnull(orer.need_manual_processing ,0) DESC,
`create_time` DESC
完美,脚步跑的结果就是下面这个:
如果需要的话在在filed补全数据,这样数据格式就统一了