MySQL实现字段的自定义排序的方法

 更新时间:2024年04月12日 08:59:10   作者:天空sky蓝  
一般情况下,我们排序都是直接利用 order by 字段 asc/desc;但是如果要排序的字段数据格式并不能直接实现,或者说我们需要指定的顺序且没有什么规律,简单的order by字段就实现不了,所以本文给大家介绍了MySQL实现字段的自定义排序的方法,需要的朋友可以参考下

数据

首先有一张产品表

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字段自定义排序的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL最基本的命令使用汇总

    MySQL最基本的命令使用汇总

    这篇文章为大家分享了MySQL最基本的命令使用汇总,MySQL最基本的命令使用,包括如何正确连接MySQL(和PHP搭配之最佳组合),修改密码与增加新用户等相关内容的描述,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • MySQL 多表连接查询实战指南:内连接 + 外连接

    MySQL 多表连接查询实战指南:内连接 + 外连接

    本文详细介绍了MySQL中的内连接、左外连接和右外连接的基本概念、语法和应用场景,通过案例实战展示了如何在实际开发中应用这些连接方式,帮助读者掌握多表查询的核心技能,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • mysql 5.7.13 winx64安装配置教程

    mysql 5.7.13 winx64安装配置教程

    这篇文章主要为大家分享了windows下mysql 5.7.13winx64安装配置教程,总结在安装mysql5.7时遇到的坑,感兴趣的朋友可以参考一下
    2016-12-12
  • mysql 查询重复的数据的SQL优化方案

    mysql 查询重复的数据的SQL优化方案

    这篇文章主要介绍了mysql 查询重复的数据的SQL优化方案,非常不错的方案推荐给大家。
    2015-02-02
  • MySQL修改密码方法汇总

    MySQL修改密码方法汇总

    本文中小编给大家汇总介绍了MySQL修改密码的方法,分为MySQL5.7版本之前以及MySQL5.7版本之后的修改方法,有需要的小伙伴可以参考下
    2018-08-08
  • 在MySQL中操作克隆表的教程

    在MySQL中操作克隆表的教程

    这篇文章主要介绍了在MySQL中操作克隆表的教程,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Linux中MySQL跳过密码验证以及Bug的解决方法(图文)

    Linux中MySQL跳过密码验证以及Bug的解决方法(图文)

    这篇文章主要介绍了Linux中MySQL跳过密码验证以及Bug的解决方法,文章通过代码示例和图文结合的方式给大家讲解的非常详细,对大家解决问题有一定的帮助,需要的朋友可以参考下
    2024-09-09
  • 一文带你搞懂MySQL的MVCC机制

    一文带你搞懂MySQL的MVCC机制

    MySQL中的MVCC机制想必大家都有所耳闻吧,虽然在平时MySQL使用过程中基本上用不到,但是面试中出场率十分高,那么你对MVCC机制了解多少呢,MVCC机制是用来干嘛的呢,底层的工作原理是怎么样的呢,本文就带你一探究竟
    2023-07-07
  • MySQL定时任务EVENT事件的使用方法

    MySQL定时任务EVENT事件的使用方法

    本文主要介绍了MySQL定时任务EVENT事件的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Mysql的MHA高可用及故障切换问题小结

    Mysql的MHA高可用及故障切换问题小结

    MHA是基于MySQL主从复制的高可用解决方案,通过自动切换到从节点并提升其为新主,实现数据库的高可用和故障恢复,配置包括主从复制、MHA组件、VIP管理等,通过配置无密码认证和测试连接,可以确保MHA正常运行,感兴趣的朋友一起看看吧
    2024-12-12

最新评论