我没有这样的价值观
AM1,M3,M4,M14,M30,M40,MA01,A10,A13,A07,B01,B10,Z33,Z13
etc(实际上是字母后面的2-3位整数)。
我试过分类
order by length(qt_no), qt_no
它没有达到我要求的输出。
我的预期产出是
A01,A07,A10,A13,B01,AM1,M3,M4,M14,M30,M40,MA01,Z13,Z33
请记住,这些qt\u no值属于同一表的同一字段和不同行。
我不知道从现在开始该怎么办。
任何帮助都将不胜感激。
编辑
下面是一个示例数据库。
4条答案
按热度按时间bttbmeg01#
最好的方案是创建两个额外的列,一个用于字母部分,一个用于数字部分;那就简单到
ORDER BY alpha_part ASC, num_part ASC
. 如果在这两列上有一个联合索引,它也会非常快。如果您必须在查询时解析列,那么这需要时间,而且索引也会变得毫无用处,这会使一切变得非常缓慢。但你可以这样做:
编辑:我很抱歉,但我不知道如何在5.7上做,除了这样:
jk9hmnmh2#
由于mysql版本<8.0中缺少regex函数,我们可以创建一个自定义函数从给定字符串中提取数字子字符串。
下面是这个答案的修改后的函数,它从输入字符串返回整数值。这里所做的修改是它返回string而不是int
07
,需要按原样返回,而不是7
.现在,您可以使用这个自定义函数,按字母部分排序,然后按数字部分排序(转换为
unsigned
).db小提琴演示
sqougxex3#
您可以将顺序分为三个阶段:首先是字母,然后是字符串长度,最后是字母顺序:
rta7y2nd4#
不漂亮,正如前面所说,因为我们是字符串解析,它将是缓慢的。这假设您的格式是字母,然后数字值从不混合。它找到第一个数值,然后根据这个结果分成两列。
演示:
我只想按qt\u no+0排序以获得自然排序,但这不起作用。所以我走了另一条路。。。。
field1是你的qt\u no字段。。。
给了我们:
没有用户变量,但将数据拆分为字母和数字。