mysql用点按数字排序

tpxzln5u  于 2023-06-21  发布在  Mysql
关注(0)|答案(6)|浏览(85)

我有一个列,其名称为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)

6fe3ivhb

6fe3ivhb1#

虽然有点笨拙,但只要你的所有条目都是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)
;
j91ykkif

j91ykkif2#

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。因此,它具有一定的局限性。也就是说,很有可能它会很好地满足您的目的。

ohtdti5x

ohtdti5x3#

它可能会帮助,简单而准确的答案:

SELECT `COLUMN_NAME` FROM `TABLENAME` WHERE 1 ORDER BY `COLUMN_NAME` *1
toe95027

toe950274#

这被称为“自然排序”,在MySQL中没有办法执行自然排序:Natural Sort in MySQL
您可以通过使用特殊的排序字段来解决它。具有如下值:
10808 10809 10901 10902 10910(前导零)
PS作为一个奖金-排序整数的工作muuuuch比排序字符串(特别是字符串与一些魔术规则)。特别是如果你创建了排序索引。

siv3szwd

siv3szwd5#

没有一个答案很实用(要么是错误的,要么是不实用的)。假设你的带点的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

现在一切都好了

xghobddn

xghobddn6#

有点不同的问题。我有一个列表,看起来如下所示:

  • 1
  • 1.1
  • 1.2
  • ...
  • 1.10
  • 1.10.1
  • 1.11

我使用REGEXP_REPLACE插入前导“0”解决了MariaDB中的问题:
ORDER BY REGEXP_REPLACE(kKey,'.(:<:[1-9]):>:]','.0\1');
我在“.”之后最多有2个数字,所以我在单词边界之间替换所有点,然后用一个数字(:<:[1-9]):>:)并捕获数字。然后将其替换为“.0”+捕获的数字。

相关问题