订购MySQL结果

时间:2017-07-27 08:33:11

标签: mysql mariadb

我正在使用MySQL / MariaDB。我有一个查询,我使用ORDER BY user_id ASC它给了我以下结果:

+---------+
| 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_iduser开头,效果都很好。但是,如果我的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实现吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

ids 总是 REGEXP '^[[:alpha:]]+[[:digit:]]+$吗?如果是,则使用REGEXP_REPLACE删除要按alpha部分排序的数字,然后删除字母并添加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功能。