mysql中使用order by 排序时使用if()函数应用场景。

假设有一个用户信息表。有一个字段是学历。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二级排序。

文章更新待续。。。。。

### MySQL 5.7 排序函数及其使用方法 #### ORDER BY 子句 ORDER BY 是 SQL 查询中最常用的排序工具之一。通过此子句可以按照一个或多个字段升序(ASC) 或降序(DESC) 对结果集进行排列。 ```sql SELECT column_list FROM table_name WHERE condition ORDER BY column1 [ASC|DESC], column2 [ASC|DESC]; ``` 尽管 MySQL 5.7 版本不支持窗口函数如 ROW_NUMBER(),仍然可以通过巧妙运用用户定义变量来模拟类似的功能[^3]。 #### 用户自定义变量实现排序效果 当需要基于某些逻辑创建序列号,可以在 SELECT 语句内嵌入用户变量来进行处理: ```sql SET @row_number=0; SELECT (@row_number:=@row_number + 1) AS num, col1, col2 FROM your_table ORDER BY some_column; ``` 这种方法可用于生成类似于行编号的效果,并且可以根据特定条件重置计数器以适应不同的业务需求[^4]。 对于更复杂的场景比如分组内的排序,则需结合 GROUP BY 和上述提到的用户变量技巧共同完成任务。例如按部门编号(dept_no) 分组并对工资(salary) 进行排序的操作可参照下面的例子: ```sql SELECT dept_no, emp_no, salary, IF(@prev_dept = dept_no, @rank := @rank + 1, @rank := 1) AS rank_within_group, @prev_dept := dept_no FROM employees e, (SELECT @rank := 0, @prev_dept := '') init_vars ORDER BY dept_no ASC, salary DESC; ``` 这段代码首先初始化两个会话级别的变量 `@rank` 和 `@prev_dept`, 然后遍历每一行记录更新这些变量值从而达到计算每组内部排名的目的[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值