MySQL按指定字段的某个指定值排序,其他值自然排序

简介:今日项目需求产品增加了一个需求,要求审核状态字段按照未审核优先展示,再按照创建时间倒序展示。

一、建立测试消息表并插入测试数据10条

create table message(
id int auto_increment primary key not null,
audit_status tinyint(2) comment '1:未审核,2:审核通过,3:审核失败',
msg_content varchar(50) comment '消息内容',
create_time datetime comment '创建时间',
update_time datetime comment '更新时间'
)comment '消息表'
insert into message(audit_status,msg_content,create_time,update_time) values(3,'A',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(2,'B',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(1,'你好',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(3,'C',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(2,'D',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(3,'E',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(3,'F',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(2,'G',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(1,'我好',now(),null);
insert into message(audit_status,msg_content,create_time,update_time) values(1,'都好',now(),null);

注意:数据插入的时候,一条一条插入,不要全选一起执行,否则创建时间都是一样的,按照创建时间倒序就测试不了了

二、需求分析

分析:先按照要求,审核状态字段按照未审核优先展示,期望的输出结果是

【你好,我好,都好,A,B,C,D,E,F,G】这种顺序

分析:按照  order by audit_status 一定不能实现,因为要么升序,要么降序。

可需求是要 ”未审核“状态的优先展示,其他状态的自然排序,也就是 audit_status=1 的优先展示,audit_status=2和3 的自然展示。

这里需要用到一个函数:

FIELD(s,s1,s2...)

示意:该函数是返回字符串s在s1,s2...等字符串当中的位置。等同于我们找到目标数值,在按照指定顺序排序即可

三、编写SQL

SQL如下:

select * from message
order by field(audit_status,1,audit_status) asc

结果:

MySQL按指定字段的某个指定值排序,其他值自然排序_第1张图片

排序正确。

上面SQL等同于这条SQL:

select * from test
order by field(status,1)desc

在加上按照create_time倒序,期望的输出结果是

【都好,我好,你好,G,F,E,D,C,B,A】这种顺序

MySQL按指定字段的某个指定值排序,其他值自然排序_第2张图片

排序正确,需求完成。

你可能感兴趣的:(MySQL,mysql,数据库,MySQL按某字段的指定值排序,mysql,field函数)