【发布时间】:2019-08-26 01:10:01
【问题描述】:
我有一个名为 title 的列,其中包含行:
- 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)
【问题讨论】:
标签: mysql
我有一个名为 title 的列,其中包含行:
我需要这样的排序
有什么办法吗? (列类型为 varchar)
【问题讨论】:
标签: mysql
笨拙,但如果您的所有条目都采用 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)
;
【讨论】:
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 |
+--------+
请注意,这是一个 hack。因此,它具有一定的局限性。也就是说,它很有可能会很好地满足您的目的。
【讨论】:
COLUMN_NAME *1 在我的情况下效果很好。
这可能会有所帮助,简单而准确的答案:
SELECT `COLUMN_NAME` FROM `TABLENAME` WHERE 1 ORDER BY `COLUMN_NAME` *1
【讨论】:
这称为“自然排序”,在 MySQL 中无法执行自然排序:Natural Sort in MySQL
您可以使用特殊的排序字段来解决它。使用以下值:
10808 10809 10901 10902 10910 (前导零)
PS 作为奖励 - 对整数进行排序比对字符串(尤其是具有一些魔术规则的字符串)进行排序要快得多。特别是如果您创建排序索引。
【讨论】:
没有一个答案是实用的(错误的或没有表现的)。 假设您的带点的 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
现在一切都很好。
【讨论】: