简介:今日项目需求产品增加了一个需求,要求审核状态字段按照未审核优先展示,再按照创建时间倒序展示。
一、建立测试消息表并插入测试数据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
结果:
排序正确。
上面SQL等同于这条SQL:
select * from test
order by field(status,1)desc
在加上按照create_time倒序,期望的输出结果是
【都好,我好,你好,G,F,E,D,C,B,A】这种顺序
排序正确,需求完成。