2010-08-22 47 views
1

最後的字母數字值我有一個包含在一個MySQL數據庫的用戶名現場 例如:查找mysql的

johndoe2 
johndoe10 
johndoe3 

如果我通過那場DESC訂購我得到:

johndoe3 
johndoe2 
johndoe10 

我需要獲得:

johndoe10 
johndoe3 
johndoe2 

任何幫助讚賞

+0

你目前使用什麼字符編碼和排序? – 2010-08-22 16:30:48

+0

如果沒有控制字符將字符串與數字分開,那麼要可靠地檢索用於排序的數值非常困難。 IE:'RIGHT(field,1)'會返回「0」而不是「10」... – 2010-08-22 16:33:07

+0

難道你不能填充這些數字(例如:johndoe2變成johndoe02)?或者將它們存儲在不同的列中? – NullUserException 2010-08-22 16:37:06

回答

0

如果不關注績效,請考慮編寫一個function like this one to remove non-numeric characters,然後將該調用簡單地包含在您的ORDER BY中。

SELECT * 
FROM MyTable 
ORDER BY 
     CAST(strip_alpha(UserName) as int) DESC 

對於更高性能+無憂的解決方案,考慮將用戶名中的數字提取到新列中。然後你可以很容易地ORDER BY:

SELECT * 
FROM MyTable 
WHERE UserName LIKE 'johndoe%' 
ORDER BY TrailingDigit DESC 
1

這是一個巨大的黑客,但我認爲會工作。如果你的列名是S:

order by 
    (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(s, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', ''), 
    length(s) desc, 
    s desc 

首先排序文本的字母部分,讓所有同名字連在一起,然後按長度,讓他們進行排序大致數字,然後由s。現在最後的order by s現在可以正常工作,因爲它僅用於在具有相同數字位數的相同名稱之間消除歧義。