MySL实现如等级成色等特殊顺序的排序详解

作者:北桥苏 时间:2024-01-17 15:11:07 

前言:

在涉及商品类的项目时,为了给同一类商品定位,往往会分等级或者成色。而等级/成色有时是用类似A,A+,A+1,K,L1,L2等英文与数字的组合进行表述。既然是等级,自然就会区分高等级,低等级。有高有低,又给商品定了等级,所以到了商品列表展示,等级排序自然少不了。     

项目在开始做的时候关于商品等级字段是直接存储的上面的字母数字,也就是A,A+1之类的。所以在需要以等级排序的时候,以英文字母的方式升序倒序就出现了问题,比如大部分等级中,S是最高级,而英文倒序S排在了后面。 

冲突:

直接以英文字母排序很显然是不行的,于是首先想到的是数据表的等级字段改为int,存入数字。在配置里或者单独建一张表与对应数字关联一个等级。类似K对应1之类的,需要升序降序就对数字排序,这样就解决了S排序问题。但是,现实的是商品表的数据量极大,如果要给原来的等级做关联,就要小心的写SQL替换或者手动一个一个改。不知道有没有在不需要修改表的情况下解决那种特殊字符排序的方法,后来还真想到了一个方法。 

解决方法:

通过使用MySQL的find_in_set函数,通过自定义的顺序进行排序,所以后续将某个等级提前改动都不会那么被动了,如下示例。

1. 可以先定义升序,倒序的排列

"grade_desc" => ["S","A+","A1","A2","B+1","B+2","B1","B2","C+1","C+2","C1","C2","D+1","D+2","D1","D2","D3","E+1","E+2","E1","E2","F","G+","G1","G2","H+","H1","H2","I+","I1","I2","J+","J","K+","K"]"grade_asc" => ["K","K+","J","J+","I2","I1","I+","H2","H1","H+","G2","G1","G+","F","E2","E1","E+2","E+1","D3","D2","D1","D+2","D+1","C2","C1","C+2","C+1","B2","B1","B+2","B+1","A2","A1","A+","S"]

2. 查询示例

MySL实现如等级成色等特殊顺序的排序详解

MySL实现如等级成色等特殊顺序的排序详解

3. ThinkPHP5的使用方式

3.1. 升序

$list = GoodsItem::where('delete_time','=',0)
           ->field('id,grade')
           ->orderRaw("find_in_set(grade,'K,K+,J,J+,I2,I1,I+,H2,H1,H+,G2,G1,G+,F,E2,E1,E+2,E+1,D3,D2,D1,D+2,D+1,C2,C1,C+2,C+1,B2,B1,B+2,B+1,A2,A1,A+,S')")
           ->select();
return $list->toArray();

3.2. 倒序

$list = GoodsItem::where('delete_time','=',0)
           ->field('id,grade')
           ->orderRaw("find_in_set(grade,'S,A+,A1,A2,B+1,B+2,B1,B2,C+1,C+2,C1,C2,D+1,D+2,D1,D2,D3,E+1,E+2,E1,E2,F,G+,G1,G2,H+,H1,H2,I+,I1,I2,J+,J,K+,K')")
           ->select();
       return $list->toArray();

3.3.效果

MySL实现如等级成色等特殊顺序的排序详解

MySL实现如等级成色等特殊顺序的排序详解

4. find_in_set函数

这个函数可以放在where中使用,查询字段是否存在某个范围内,有点像IN,但还是有区别,具体的后期补上。

来源:https://segmentfault.com/a/1190000043822232

标签:MySQL,等级排序,成色排序,特殊顺序
0
投稿

猜你喜欢

  • Golang使用channel实现一个优雅退出功能

    2024-04-28 09:14:28
  • 我喜欢你 抖音表白程序python版

    2023-06-11 12:54:17
  • 深入理解PHP之数组(遍历顺序) Laruence原创

    2024-06-05 09:38:05
  • Python实现将HTML转换成doc格式文件的方法示例

    2023-05-30 06:42:43
  • MySQL最新漏洞分析

    2012-07-11 15:41:10
  • 女神相册密码忘记了 我只用Python写了20行代码

    2021-05-01 13:27:11
  • Perl使用Tesseract-OCR实现验证码识别教程

    2022-04-22 07:52:05
  • python机器学习sklearn实现识别数字

    2023-08-18 17:57:19
  • Python使用JSON库解析JSON数据的方法

    2021-09-24 13:35:10
  • JavaScript 判断浏览器类型及版本

    2024-05-13 10:36:39
  • Python实现进程同步和通信的方法

    2023-08-30 04:21:45
  • 怎样修改 MySQL数据库中的密码

    2008-11-27 15:35:00
  • Python matplotlib 绘制双Y轴曲线图的示例代码

    2023-04-14 11:07:27
  • 微信小程序应用号开发体验

    2022-03-12 12:56:02
  • Python与人工神经网络:使用神经网络识别手写图像介绍

    2022-05-23 03:11:36
  • 很棒的js Tab选项卡切换效果

    2024-02-23 14:42:30
  • python实现批量修改图片格式和尺寸

    2021-02-12 10:47:35
  • SQL Server 2005数据库批量更新解决办法

    2009-04-11 16:12:00
  • 学习XHTML和HTML之间的区别

    2007-08-22 11:02:00
  • python snownlp情感分析简易demo(分享)

    2021-07-18 04:32:35
  • asp之家 网络编程 m.aspxhome.com