2017-07-27 39 views
2

私はMySQL/MariaDBを使用しています。私がいる限り、すべてのuser_idさんはuserで始まるとして素晴らしい作品を示唆ソリューションORDER BY LENGTH(user_id), user_id ASCを試してみました注文MySQLの結果

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

:私はそれは私に次のような結果になります、私はORDER BY user_id ASCを使用するクエリを持っています。私は始めるのはのはadminを言わせuser_id」を持っている場合しかし、それは私にこの与える:

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

をしかし、私は結果は次のように注文したい:私はSQLでこれを達成することができます

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

+0

私は私が開始 'user_id'年代を持っていることに気づいた[質問](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

申し訳ありませんが、このを見てみましょう'admin'もあります。質問とSQL Fiddleを更新しました: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)) 

原理は、文字列の比較は、「正しく」動作するように、数字の部分に十分な先行ゼロを置くことです。

注:これは、MySQLで利用できないMariaDBの機能を使用しています。