假设有一个用户信息表。有一个字段是学历。1=高中以下,2=高中,3=专科,4=本科,5=硕士,6=博士。有一个需求是本科显示在前面,然后按学历高低显示。
1.执行下面的sql
CREATE TABLE `user_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(255) DEFAULT NULL COMMENT '姓名',
`edu_degree` int(1) NOT NULL COMMENT '学历(1=高中以下,2=高中,3=专科,4=本科,5=硕士,6=博士)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息';
INSERT INTO `user_info`(`id`, `user_name`, `edu_degree`)values
(1, '李一恒', 1),(2, '张一鸣', 1),(3, '赵一楠', 1),(4, '钱和一', 1),(5, '孙依一', 1),
(6, '周二凡', 2),(7, '吴二平', 2),(8, '郑二玮', 2),(9, '王二语', 2),(10, '冯二乐', 2),
(11, '陈三皓', 3),(12, '褚三和', 3),(13, '卫三睿', 3),(14, '蒋三晗', 3),(15, '沈三哲', 3),
(16, '韩四圆', 4),(17, '杨四秋', 4),(18, '朱四宏', 4),(19, '秦四琪', 4),(20, '尤四霖', 4),
(21, '许五菱', 5),(22, '何五森', 5),(23, '吕五可', 5),(24, '施五明', 5),(25, '张五泓', 5),
(26, '孔六琛', 6),(27, '曹六茹', 6),(28, '严六悦', 6),(29, '华六怡', 6),(30, '金六媛', 6);
2.正常查询只能实现1-6,或者6-1的学历排序。
这个时候。我们就能用得上order by里面加if函数了。可以让学历为4的显示在前面。然后其他数据正常排序。
select * from user_info
order by if(edu_degree=4,0,1),edu_degree desc;
总结:order by中是可以用函数的。常用的有if(),ifnull()
当然,上述的需求还有以下解决方法。
1.置顶排序
select * from user_info
order by edu_degree=4 desc ,edu_degree desc;
2.case when 去弄一个结果集字段用于排序。且适用于更混乱的排序。
select *,
case
when edu_degree=4 then
7
else
edu_degree
end order_degree
from user_info
order by order_degree desc;
SELECT * FROM user_info
ORDER BY
CASE WHEN edu_degree = 4 THEN
0
ELSE
1
END,
edu_degree DESC;
常见问题:
1.mysql中if函数的作用
2. order by if(edu_degree=4,0,1),edu_degree desc 看不懂。
if(edu_degree=4,0,1) 是一级排序。会将 edu_degree=4结果当成0,其他的就是1,那么edu_degree=4的就在最前面了。因为edu_degree=1,2,3,5,6的一级排序级别一样,就走edu_degree desc二级排序。
文章更新待续。。。。。