mysql 对于null字段排序处理

最近遇到一个需求 ,需要对一个报表的多个字段进行多字段复杂条件排序

排序字段为NULL时

Mysql对于排序字段为NULL时,有自身默认的排序规则,默认是认为null 值 是无穷小

ELECT id,
       script_id,
       last_modified,
       live_count,
       next_show
FROM virtual_live_script
where 1 = 1
  and creator is null
ORDER BY
    live_count desc,
    next_show asc,
    last_modified desc;

可以看到 next_show 为空的字段 的确按照 升序 是最小的
mysql 对于null字段排序处理_第1张图片如果想让 next_show 为 null的记录排在最后 应该怎么处理呢?可以在引入一个新的字段 比如sort 字段,排序的时候 对这个新的字段也排序,就可以实现上述逻辑,同样的思路 还可以对null 值字段进行特殊处理

SELECT id,
       script_id,
       last_modified,
       live_count,
       next_show,
       next_show is null as sort
FROM virtual_live_script
where 1 = 1

  and creator is null

ORDER BY live_count desc,
         sort asc,
         next_show asc,
         last_modified desc;

mysql 对于null字段排序处理_第2张图片

还有一种不加辅助字段的方法,利用IFNULL 函数,这里给为空时间,指定一个值,只不过要在业务代码中要去除2030-01-01 00:00:00 这个,有点侵入性!

SELECT id,
       script_id,
       last_modified,
       live_count,
       ifnull(next_show,'2030-01-01 00:00:00') as tmp
FROM virtual_live_script
where 1 = 1

  and creator is null

ORDER BY live_count desc,
         tmp asc,
         last_modified desc;

mysql 对于null字段排序处理_第3张图片

多条件复杂排序

对于多条件的复杂排序,可以使用case … when语句,类似如下思路


SELECT id,
       script_id,
       script_name,
       cover_url,
       last_modified,
       live_count,
       pre_count,
       end_count,
       status,
       next_show
FROM virtual_live_script
where 1 = 1

  and creator = :creator
order by live_count desc,
         CASE
             WHEN live_count = 0 AND next_show IS NULL THEN -1
             WHEN live_count = 0 AND pre_count > 0 THEN 0
             ELSE 0
             END desc,
         next_show asc,
         last_modified desc;

参考

Mysql排序字段为NULL如何排序
sort-by-start-date-desc-if-end-date-is-null-if-not-sort-by-end-date

你可能感兴趣的:(mysql,数据库)