2014-01-17 76 views
3

我有一個MySQL表中的數據,之後順序按字母AZ但「AA」與title像這樣:MySQL查詢到「Z」

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,等等?

我的想法:如果我算其中的空間在title發生時,我可以通過這個數字ASC,然後順序排序在第二優先級冠軍ASC。這應該首先按字母順序給我所有的3位數字代碼,然後按字母順序排列所有4位數字代碼,然後按字母順序排列所有5位數字代碼,對嗎?

+2

試'ORDER BY LEN(COL),col' –

+0

不幸title'的'的長度是任意的,因爲它是代碼(如'16A'),隨後由實際標題(其可以具有任何長度) 。但是偉大的想法! –

回答

2

嘛,哎呀,我想我只需要通過這個交談。該解決方案是簡單的使用MySQL LOCATE()找到空間,從而推斷出代碼的長度:使用這是使用substring_index()和長度第一個排序,然後將值來獲得的第一個代碼

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 
+0

你總是有兩位數字部分,或者它可以改變? – fthiella

+0

通常有一個數字,但是,它們總是作爲一個組返回。因此,所有「16__」在一組中,或者所有「1__」在一組中,但從不混合。 –

2

的一種方式:

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

謝謝!這也是很好的知識。 +1 –