分享一个mysql中用case-when排序的方法实例

case-when用法有很多中,再此分享一种你可能不知道的但很实用的方法。如想详细了解case-when所有用法,请自行查阅资料。

之前写一个需要用到排序的需求,对表排序筛选,选出来的数据立即处理。主要业务点:客户有1,2,3,4,5,6等级别,1-4级为一组,5,6级为一组,5-6级的优先处理,之后在处理1-4级。

最早我写了一个子查询,将1-4归为一类,5,6归为一类,在排序,能实现需求,但性能不好。

后来更具case-when经行优化,优化后的sql如下:

SELECT
	*
FROM
	t_automatic_assign t
ORDER BY
	t.RETRIEVE_STATUS DESC,
	(
		CASE
		WHEN DECISION_LEVEL = 5
		OR DECISION_LEVEL = 6 THEN
			1
		ELSE
			2
		END
	),
	t.CREATE_DATE ASC
LIMIT 1

sql的作用为:筛选t_automatic_assign表中的数据,根据RETRIEVE_STATUS,DECISION_LEVEL,CREATE_DATE排序,优先考虑RETRIEVE_STATUS,倒序排序,在考虑DECISION_LEVEL,DECISION_LEVEL的排序规则为:1-4级为一组,5,6级为一组,5,6级的优先处理,之后在处理1-4级。最后考虑CREATE_DATE升序徐排序,最后取筛选到的第一条。

这个需求的关键点在于:1-6级并不是简单的取倒序,要求1-4同样看待,5,6同样看待。如果sql很长,写子查询不方便阅读,也容易乱,用上面的方法,很明了,减少子查询,应该会快点(有兴趣可验证,鄙人没验证过。啦啦啦)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值