我有一个用户名作为唯一主键的表。
我运行这个查询以升序排列它们
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)
我怎样才能做到这一点?
我创建了一个名为“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)
归档时间: |
|
查看次数: |
699 次 |
最近记录: |