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

时间:2014-01-17 15:35:10

标签: mysql sql string

我在MySQL表中有数据,title就像这样:

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(正确)在16A之后立即放置16AA(如上所列)。我想要的是列出所有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,等等?

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

2 个答案:

答案 0 :(得分:3)

使用此方法的一种方法是使用substring_index()获取第一个代码,然后按长度排序,然后按值排序:

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

答案 1 :(得分:2)

嗯,哎呀,我想我只需要谈谈这个。解决方案很简单,使用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