MySQL自定义排序sql写法

【饿了么、美团】外卖红包领取地址 >> 能省一点是一点

背景

自定义排序,意思是在表中的某个字段A,值有1,2,3。现想要按照自定义的序列来排序,如(2,1,3)的顺序排序。

解题思路:虚拟出一个不存在的排序字段sort,这个字段不需要存在表中,是通过一定的方式根据字段A的值实时计算出来,之后正常的按照sort字段排序即可。

使用field函数

介绍一下field函数

field(value, val1, val2, val3, ...)

其中value为字段,val1及后续字段为要搜索的值列表。
函数会返回每条记录中,value字段上的值在后续值列表中的索引位置,索引从1开始,找不到返回0,函数不区分大小写。

写法:
按照(2,1,3)排序

select * from table
order by field(A,2,1,3)

这个写法有个缺点,就是在表中如果只有1,2,3的值时能正常工作,而如果还有其他值如4,因为4未指定,field返回的是0,所以4会排在前面。
如果我们想要按照(2,1,3,其他)的顺序排列,通过这个办法其实也能实现,思考一下~

解题办法也很简单,就是倒序,只是sql上的写法看起来会有点奇怪(因为要反过来写)

select * from table
order by field(A,3,1,2) desc

通过将(2,1,3)倒序变成(3,1,2),然后增加desc倒序即可实现。

使用case when

case when其实就是if else,实现原理跟上面是一样的,只是如果自定义排序的值比较多的话,写的sql就比较长
写法:

select * from table
order by case A
when 2 then 1
when 1 then 2
when 3 then 3
else 4 end

相当于通过case when实现了一个自定义的field函数,2的时候排序值为1,1的时候排序值2,3的时候排序值3,其他值都为4。然后正序排即可。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

墨一 发财树盆栽 盆栽玻璃盆四季常青好养活室内绿植办公室桌面茶几小盆景
¥26.00
绿园匠 陶瓷花盆简约中国风创意家用客厅室外阳台室内绿植花卉绿萝发财树蝴蝶兰花盆 荷塘清趣 特大号
¥43.28
云峰海瑞 观赏金鱼 冷水鱼 观赏鱼金鱼 活体鱼 淡水鱼小金鱼活鱼 冷水鹦鹉鱼9-15厘米2条
¥26.90
得力(deli) 连中三元速干考试可用中性笔学生办公黑色0.5mm签字笔加强型针管顺滑碳素水性笔 12支速干按动款【V1】
¥19.90
京祝 口罩医用白色成人一次性外科口罩可爱灭菌级独立包装冬季薄款男女防尘防花粉 元气少女50枚装
¥35.00
美国小学英语1A、1B(套装共2册)
¥34.71
潘祥记 亚麻籽全麦面包片独立包装整箱早餐代餐休闲小吃食品零食点心 亚麻籽全麦吐司
¥26.90
岁月合 加厚牛津布防潮被子收纳整理袋 大容量搬家袋衣物整理打包大号行李袋
¥15.20