mysql用点数排序

时间:2013-11-22 10:08:46

标签: mysql

我有一个名称标题为行的列:

  • 1.8.8
  • 1.8.9
  • 1.9.1
  • 1.9.2
  • 1.8.10

我需要这样排序

  • 1.8.8
  • 1.8.9
  • 1.8.10
  • 1.9.1
  • 1.9.2

是怎么做到的? (列的类型是varchar)

5 个答案:

答案 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

现在一切都很好。