将行顺序更改为字母然后数字

Kaz*_*tus 2 mysql order-by

我有一个用户名作为唯一主键的表。

我运行这个查询以升序排列它们

ALTER TABLE  `table` ORDER BY  `Username` ; 
Run Code Online (Sandbox Code Playgroud)

所以行是这样排序的

+-----------+----------+
| Username  | Password |
+-----------+----------+
| soho16793 | test1    |
| soho4595  | test2    |
| soho504   | test3    |
| soho931   | test4    |
+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

但我想要他们这样

+-----------+----------+
| Username  | Password |
+-----------+----------+
| soho504   | test3    |
| soho931   | test4    |
| soho4595  | test2    |
| soho16793 | test1    |
+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Vér*_*ace 5

我创建了一个名为“billy”的表。

mysql> SELECT * FROM billy ORDER BY f1;
+----------+-------+
| f1       | f2    |
+----------+-------+
| soho10   | test5 |
| soho12   | test1 |
| soho123  | test2 |
| soho1234 | test4 |
| soho222  | test3 |
+----------+-------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

这没有给出正确的排序顺序 - 1234 大于 222!

然后,从这里,我得到了 SUBSTRING() 函数并制定了以下 SQL:

mysql> SELECT CAST(SUBSTRING(f1, 5, LENGTH(f1)) AS UNSIGNED) 
AS fred, f2 FROM billy ORDER BY fred ASC;
Run Code Online (Sandbox Code Playgroud)

它为您提供了排序所需的整数(“fred”是新整数列的别名):

+------+-------+
| fred | f2    |
+------+-------+
|   10 | test5 |
|   12 | test1 |
|  123 | test2 |
|  222 | test3 |
| 1234 | test4 |
+------+-------+
5 rows in set (0.00 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

也有助于 CASTing。感谢@oNare 在下面的评论中提出的问题,这让我将这篇文章从使用MID() 函数更改为更标准的 SUBSTRING()。

你需要的答案是由

SELECT * FROM billy ORDER BY CAST(SUBSTRING(f1, 5, LENGTH(f1)) AS UNSIGNED) ASC;

+----------+-------+
| f1       | f2    |
+----------+-------+
| soho10   | test5 |
| soho12   | test1 |
| soho123  | test2 |
| soho222  | test3 |
| soho1234 | test4 |
+----------+-------+
5 rows in set (0.00 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)