2017-07-27 198 views
2

我正在使用MySQL/MariaDB。我有一個查詢,我用ORDER BY user_id ASC它給了我以下結果:訂購MySQL結果

+---------+ 
| user_id | 
+---------+ 
| admin1 | 
| admin10 | 
| admin11 | 
| admin2 | 
| user1 | 
| user10 | 
| user11 | 
| user12 | 
| user13 | 
| user2 | 
| user20 | 
| user21 | 
| user22 | 
| user23 | 
+---------+ 

我嘗試了建議的解決方案ORDER BY LENGTH(user_id), user_id ASC很大,只要是可以作爲所有user_id的與user開始。但是,如果我有user_id的,與開始假設admin然後它給了我這樣的:

+---------+ 
| user_id | 
+---------+ 
| user1 | 
| user2 | 
| admin1 | 
| admin2 | 
| user10 | 
| user11 | 
| user12 | 
| user13 | 
| user20 | 
| user21 | 
| user22 | 
| user23 | 
| admin10 | 
| admin11 | 
+---------+ 

但我想結果命令是這樣的:

+---------+ 
| user_id | 
+---------+ 
| admin1 | 
| admin2 | 
| admin10 | 
| admin11 | 
| user1 | 
| user2 | 
| user10 | 
| user11 | 
| user12 | 
| user13 | 
| user20 | 
| user21 | 
| user22 | 
| user23 | 
+---------+ 

我可以用SQL實現這一目標?

+0

看看這個[問題](https://stackoverflow.com/questions/8557172/mysql-order-by-sorting-alphanumeric-correctly) –

回答

5

使用LENGTH功能以及您的列

SELECT * 
FROM yourtable 
ORDER BY LENGTH(user_id), user_id ASC 

輸出

user_id 
user1 
user2 
user10 
user11 
user12 
user13 
user20 
user21 
user22 
user23 

SQL小提琴:http://sqlfiddle.com/#!9/23f4de/3/0

+0

對不起,我意識到,我有'user_id'開始與'管理員'也。我已經更新了這個問題和SQL小提琴:http://sqlfiddle.com/#!9/01eef0/1/0 – g3blv

0

是IDS 總是REGEXP '^[[:alpha:]]+[[:digit:]]+$?如果是這樣,那麼使用REGEXP_REPLACE刪除數字以便按字母部分進行排序,然後刪除字母並將0(變成數字)加以排序數字部分。喜歡的東西:

ORDER BY REGEXP_REPLACE(user_id, '[[:digit:]]+$', ''), 
     REGEXP_REPLACE(user_id, '^[[:alpha:]]+', '') + 0 

另一個想法:

ORDER BY REGEXP_REPLACE(user_id, 
       '([[:digit:]]+)', 
       RIGHT(CONCAT('0000000', '\\1'), 8)) 

的原理是把上的數字部分足夠的前導零,使字符串比較會工作「正確」。

注意:這使用了MariaDB在MySQL中不可用的功能。