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

时间:2022-12-13 18:52:43

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很长,写子查询不方便阅读,也容易乱,用上面的方法,很明了,减少子查询,应该会快点(有兴趣可验证,鄙人没验证过。啦啦啦)