我有一个名称标题为行的列:
我需要这样排序
是怎么做到的? (列的类型是varchar)
答案 0 :(得分:3)
笨拙,但如果所有条目的格式都是x.x.x:
,那么应该可以使用select yourColumn
from yourTable
order by
cast(substring_index(yourColumn,'.',1) as unsigned),
cast(substring_index(substring_index(yourColumn,'.',2),'.',-1) as unsigned),
cast(substring_index(substring_index(yourColumn,'.',3),'.',-1) as unsigned)
;
答案 1 :(得分:2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(legal VARCHAR(12) NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES('1.8.8'),('1.8.9'),('1.9.1'),('1.9.2'),('1.8.10');
SELECT * FROM my_table ORDER BY INET_ATON(legal);
+--------+
| legal |
+--------+
| 1.8.8 |
| 1.8.9 |
| 1.8.10 |
| 1.9.1 |
| 1.9.2 |
+--------+
请注意,这是一个黑客攻击。因此,它有一定的局限性。也就是说,它很可能会为您的目的而正常工作。
答案 2 :(得分:1)
它可能有所帮助,简单和准确答案:
SELECT `COLUMN_NAME` FROM `TABLENAME` WHERE 1 ORDER BY `COLUMN_NAME` *1
答案 3 :(得分:0)
这称为“自然排序”,并且无法在MySQL中执行自然排序:Natural Sort in MySQL
您可以使用特殊的排序字段来解决它。使用的值如下:
10808 10809 10901 10902 10910 (领先零)
PS作为奖励 - 排序整数比排序字符串(特别是具有一些魔法规则的字符串)更快地工作。特别是如果你创建排序索引。
答案 4 :(得分:0)
没有一个答案是切实可行的(错误或不正确的表现)。 假设您的带点的varchar列是productId,那么您必须使用:
SELECT * FROM PRODUCT_TABLE ORDER BY productId * 1,length(productId)
productId * 1
为您提供与INET_ATON(productId)
相同的结果,但它们都不完整。
0.0.0
0.0
0
我得到了这样的结果,以便修正刚刚添加的length(productId)
。
0
0.0
0.0.0
现在一切都很好。