我在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位数代码,是否正确?
答案 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