MySQL实现字段的自定义排序的方法
作者:天空sky蓝
数据
首先有一张产品表
CREATE TABLE `product` ( `product_id` varchar(50) COLLATE utf8mb4_bin NOT NULL, `brand_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL, `brand` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL, `product_type` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'S-Single Item, K-Product Kit', `name_en` varchar(200) COLLATE utf8mb4_bin NOT NULL, `name_t_ch` varchar(240) COLLATE utf8mb4_bin DEFAULT NULL, `name_s_ch` varchar(240) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1702 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
一些数据:
具体的数据可以自己插入一些测试数据进行测试,我的数据里面已经是有了很多各种数据,包括了下面排序要求的数据了。
需求
最近遇到一个这样一个需求,针对页面上的展示效果需要一个特定的排序,即我想看到这些特定的产品id需要排在前面,然后后面按照我需要的顺序进行排序。
之前的排序顺序是按照product id的升序排序的,字符串的排序。
SELECT product_id, name_t_ch FROM product p ORDER BY product_id ;
下面则是要求修改后的排序顺序:
解决方案
使用代码实现排序(不是很好)
因为这个是在页面上有显示,并且是有分页,如果使用代码排序的话,则需要查出所有数据然后再手动分页,用不上数据库的分页了。
使用MySQL的排序来实现(推荐)
使用 order by field(column, str1,str2,str3)
格式:field(value,str1,str2,str3,str4),value与str1、str2、str3、str4比较,返回1、2、3、 4,如遇到null或者不在列表中的数据则返回0
简单版本的一个排序:
SELECT product_id , name_t_ch FROM product p ORDER BY field(product_id, 'MR-0800004', 'MR-0800007', 'MR-0800001', 'MR-0800002') , product_id ;
结果
第一个sql版本:
-- 初始版本 SELECT product_id, name_t_ch FROM product p ORDER BY FIELD( CASE WHEN product_id LIKE 'MR-%' THEN 'MR' WHEN product_id LIKE 'SD-%' THEN 'SD' WHEN product_id LIKE 'WN-%' THEN 'WN' WHEN product_id LIKE 'HHC-%' THEN 'HHC' WHEN product_id LIKE 'HS-%' THEN 'HS' WHEN product_id LIKE 'G-%' THEN 'G' ELSE 'OTHER' END, 'MR', 'SD', 'WN', 'HHC', 'HS', 'G', 'OTHER', product_id );
排序结果:
第二个sql 版本:
-- 改造版本 SELECT product_id, name_t_ch FROM product p ORDER BY FIELD( CASE WHEN product_id = 'MP-0800004' THEN 'MP-0800004' WHEN product_id = 'MP-0800007' THEN 'MP-0800007' WHEN product_id = 'MR-0800001' THEN 'MR-0800001' WHEN product_id = 'MR-0800002' THEN 'MR-0800002' WHEN product_id = 'MR-0800004' THEN 'MR-0800004' WHEN product_id = 'SD-0800001' THEN 'SD-0800001' WHEN product_id LIKE 'WN-%' THEN 'WN' WHEN product_id LIKE 'HHC-%' THEN 'HHC' WHEN product_id LIKE 'HS-%' THEN 'HS' WHEN product_id LIKE 'G-%' THEN 'G' ELSE 'OTHER' END, 'MP-0800004', 'MP-0800007', 'MR-0800001', 'MR-0800002', 'MR-0800004', 'SD-0800001', 'WN', 'HHC', 'HS', 'G', 'OTHER', product_id );
结果:
能够看到排在前面的几个 product_id 是按照我们需要的顺序排序了的。
gpt解释:在这里在 FIELD
函数中,第一个参数指定了要排序的字段或表达式,而后续的参数指定了排序的顺序。在您提供的查询中,CASE WHEN
表达式返回的结果是字符串,这些字符串用于指定排序顺序。因此,product_id
不能直接写在 FIELD
函数的第一个参数中。
使用case when 转换实现自定义排序
SELECT product_id , name_t_ch FROM product p ORDER BY CASE WHEN product_id LIKE 'MR-%' THEN 1 WHEN product_id LIKE 'SD-%' THEN 2 WHEN product_id LIKE 'WN-%' THEN 3 WHEN product_id LIKE 'HHC-%' THEN 4 WHEN product_id LIKE 'HS-%' THEN 5 WHEN product_id LIKE 'G-%' THEN 6 ELSE 7 -- 其他情况 END, product_id;
排序结果,按照了我们指定的顺序进行排序
这个查询首先根据 productid
是否以特定前缀开头进行分类,并为每个分类分配一个排序权重。然后,按照这个排序权重进行排序。如果 productid
不以任何指定的前缀开头,则默认按照原始的 productid
进行排序。
-- 如果前面还有指定的顺序的话 SELECT product_id, name_t_ch FROM product p ORDER BY CASE WHEN product_id = 'MP-0800004' THEN 1 WHEN product_id = 'MP-0800007' THEN 2 WHEN product_id = 'MR-0800001' THEN 3 WHEN product_id = 'MR-0800002' THEN 4 WHEN product_id = 'MR-0800004' THEN 5 WHEN product_id = 'SD-0800001' THEN 6 WHEN product_id LIKE 'WN-%' THEN 7 WHEN product_id LIKE 'HHC-%' THEN 8 WHEN product_id LIKE 'HS-%' THEN 9 WHEN product_id LIKE 'G-%' THEN 10 ELSE 11 END, product_id;
结果
从结果中可以看到已经按照我们需要的顺序排好了序。case when 的写法更简洁,使用这个!
小结
最后这个也可以加上分页的效果。
SELECT product_id, name_t_ch FROM product p ORDER BY CASE WHEN product_id = 'MP-0800004' THEN 1 WHEN product_id = 'MP-0800007' THEN 2 WHEN product_id = 'MR-0800001' THEN 3 WHEN product_id = 'MR-0800002' THEN 4 WHEN product_id = 'MR-0800004' THEN 5 WHEN product_id = 'SD-0800001' THEN 6 WHEN product_id LIKE 'WN-%' THEN 7 WHEN product_id LIKE 'HHC-%' THEN 8 WHEN product_id LIKE 'HS-%' THEN 9 WHEN product_id LIKE 'G-%' THEN 10 ELSE 11 END, product_id LIMIT 0, 5;
第二页
SELECT product_id, name_t_ch FROM product p ORDER BY CASE WHEN product_id = 'MP-0800004' THEN 1 WHEN product_id = 'MP-0800007' THEN 2 WHEN product_id = 'MR-0800001' THEN 3 WHEN product_id = 'MR-0800002' THEN 4 WHEN product_id = 'MR-0800004' THEN 5 WHEN product_id = 'SD-0800001' THEN 6 WHEN product_id LIKE 'WN-%' THEN 7 WHEN product_id LIKE 'HHC-%' THEN 8 WHEN product_id LIKE 'HS-%' THEN 9 WHEN product_id LIKE 'G-%' THEN 10 ELSE 11 END, product_id LIMIT 1, 5;
以上就是MySQL实现字段的自定义排序的方法的详细内容,更多关于MySQL字段自定义排序的资料请关注脚本之家其它相关文章!