MySQL查询按字母顺序A-Z排序,但;AA“;“之后”;Z";

MySQL查询按字母顺序A-Z排序,但;AA“;“之后”;Z";,mysql,sql,string,Mysql,Sql,String,我有一个MySQL表中的数据,标题是这样的: 16A Activated Charcoal 16AA Lidocaine Viscous Gel (Xylocaine ®) 16B Adenosine ( Adenocard) 16BB Lorazepam (Ativan) 16C Albuterol (Proventil, Ventolin) 16CC Magnesium Sulfate 16D Amidarone Cordarone, Nexterone 16E Aspirin 16F A

我有一个MySQL表中的数据,标题是这样的:

16A Activated Charcoal
16AA Lidocaine Viscous Gel (Xylocaine ®)
16B Adenosine ( Adenocard)
16BB Lorazepam (Ativan)
16C Albuterol (Proventil, Ventolin)
16CC Magnesium Sulfate
16D Amidarone Cordarone, Nexterone
16E Aspirin
16F  Atropine Sulfate
16G Calcium Chloride
[...]
16Z DuoDote Auto-Injector
我的应用程序使用此SQL查询生成数据列表:

SELECT uid, file, title 
FROM library 
WHERE section = '$uid' AND enabled >0 
ORDER BY title ASC
这是可行的,除了MySQL(正确地)将16AA紧跟在16A之后(如上所列)。我想要的是列出所有16A-16Z,然后是16AA-16ZZ。因此,按以下顺序返回数据:

16A Activated Charcoal
16B Adenosine ( Adenocard)
16C Albuterol (Proventil, Ventolin)
[...]
16Z DuoDote Auto-Injector
16AA Lidocaine Viscous Gel (Xylocaine ®)
16BB Lorazepam (Ativan)
16CC Magnesium Sulfate
除了在我的表中添加一个
sort
列之外,还有什么方法可以让我编写一个查询来对这些a-Z和AA-ZZ进行排序,等等


我的想法是:如果我计算
标题中空格出现的位置,我可以按该数字ASC排序,然后按第二优先级的标题ASC排序。这应该先按字母顺序给我所有的3位数代码,然后按字母顺序给我所有的4位数代码,然后按字母顺序给我所有的5位数代码,对吗?

好吧,天啊,我想我只需要把这个讲一遍。解决方案很简单,使用MySQL
LOCATE()
查找空间,从而推断代码的长度:

SELECT uid, file, title, 
LOCATE(' ', title) AS code_length 
FROM library 
WHERE section = '{$row['uid']}' AND enabled >0 
ORDER BY code_length ASC, title ASC

使用此功能的一种方法是使用
子字符串_index()
获取第一个代码,首先按长度排序,然后按值排序:

order by length(substring_index(title, ' ', 1)),
         substring_index(title, ' ', 1)

请尝试按LEN(col)排序,col
不幸的是,
title
的长度是任意的,因为它是代码(如
16A
)后跟实际标题(可能有任何长度)。但是伟大的思想!数字部分总是有两个数字,还是可以更改?通常有一个数字,但它们总是作为一组返回。因此,所有
16_u
在一个集合中,或者所有
1_
在一个集合中,但决不能两者混合。