我正在使用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_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 :(得分: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
答案 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功能。