[英]How to order delimited string of numbers in SQL
我需要正确地排序一个字符串列,该字符串列包含一组定界的数字,例如:
1
1.1
1.1.1
1.2
1.2.1
1.10
2
2.1
这些数字被用来定义一个树:例如1
和2
是顶级节点, 1.1
, 1.2
,和1.10
是直接子1
。 该树可以任意深,因此每个条目中的句点数本身没有上限(尽管实际上列上的字符数限制会强制执行此操作)。
我遇到的问题是,SQL中的标准ORDER BY
操作将在1.2
之前列出1.10
。 这当然是预料之中的,但是不幸的是我不是想要的,因为10 > 2
。 有没有有效的方法来订购我的商品? 我正在使用MySQL。
请注意,我不一定要对树使用此编码,因此,如果存在不同的编码,则排序起来比随意建议更容易。 但是,此结构提供给我的一件好事是一次轻松恢复所有上游父节点或所有下游子节点的简便方法,这与更典型的row / parent_row模型(到目前为止)不兼容。我所知)。 例如,给定id 1.2.1.4.5
我知道,这四个祖先是1
, 1.2
, 1.2.1
,和1.2.1.4
,和所有儿童(包括直接后裔和孩子的孩子)将有开头的ID 1.2.1.4.5.
。
@Abiel,根据您的评论,每个节点可能不超过50个直接子节点,在这种情况下(其中62个子节点就足够了)(如@Bohemian在评论中所述),我们可以使用计算机可读代码0-9A-Za-z
(以62为基数的编码 ),我们可以设置一个新的VARCHAR( 255 ) BINARY
列来帮助我们进行排序。
CREATE TABLE `test`.`tree` (
`computer_readable` VARCHAR( 255 ) BINARY NOT NULL ,
`human_readable` VARCHAR( 255 ) NOT NULL ,
`title` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `computer_readable` ) ,
INDEX ( `human_readable` )
);
您可能已经注意到, computer_readable
BINARY
列定义为BINARY
,因此每个节点最多可以有62个[0-9A-Za-z]
(而不是36 [0-9a-z]
)个子节点。
mysql> SELECT 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT BINARY 'a' = 'A';
+------------------+
| BINARY 'a' = 'A' |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT BINARY 'a' > 'A';
+------------------+
| BINARY 'a' > 'A' |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
因此,在这个新字段中,我们可以使用以下格式的数据(在下面的CSV中表示):
"1";"1";"Books"
"11";"1.1";"Fiction"
"111";"1.1.1";"Science-Fiction"
"12";"1.2";"Self-Help"
"121";"1.2.1";"Motivational"
"1A";"1.10";"Textbooks"
"1e";"1.40";"Coloring Books"
"2";"2";"Music"
"21";"2.1";"Classical"
哪个MySQL会很乐意为我们排序
mysql> SELECT * FROM `tree` ORDER BY `computer_readable`;
+-------------------+----------------+-----------------+
| computer_readable | human_readable | title |
+-------------------+----------------+-----------------+
| 1 | 1 | Books |
| 11 | 1.1 | Fiction |
| 111 | 1.1.1 | Science-Fiction |
| 12 | 1.2 | Self-Help |
| 121 | 1.2.1 | Motivational |
| 1A | 1.10 | Textbooks |
| 1e | 1.40 | Coloring Books |
| 2 | 2 | Music |
| 21 | 2.1 | Classical |
+-------------------+----------------+-----------------+
9 rows in set (0.00 sec)
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.