如何在MySQL中通过自定义算法对数据进行排序?
How to order data by custom algorithm in MySQL?
我有一个层次结构 table,里面有一些数据。我已经以分层方式对它们进行了排序,但其中存在一个错误。我使用一个名为 Path
的字段来执行此操作。让我们先看看 table :
这里的问题是 mysql 将每对路径作为文本进行比较。如果你看最后两行,15 比 6 大,应该与它下面的行交换。
我的问题是如何将路径的每一部分作为由点分隔的数字进行比较?
你可以做的是为路径的每一步使用两位数字,即代替 0.4.6
保存 0.04.06
,它小于 0.04.15
除此之外我要做的是使用以下公式将路径转换为数字
0.1.7.9.10.13 -> 0.1791013
乘以 10000000
0.1791013 * 10000000 = 1791013
这里有一个小窍门:
SELECT INET_ATON('0.4.15')a,INET_ATON('0.4.6')b;
+--------+--------+
| a | b |
+--------+--------+
| 262159 | 262150 |
+--------+--------+
假设您有这样的示例数据:
id num_text
---------------
1 0.4.3
2 0.4.2
3 0.4.15
4 0.4.23
这是您需要的查询:
select *
from table
order by concat(
substr(num_text,1,1),
substr(num_text,3,1),
lpad(substr(num_text,5,2),2,'0')
) asc
示例输出:
id num_text
---------------
2 0.4.2
1 0.4.3
3 0.4.15
4 0.4.23
解释:
首先,您需要使每个值具有相同的长度。例如,我们转换0.4.2 to 0402, 0.4.3 to 0403
,等等。所以这个查询:
select id,
concat(
substr(num_text,1,1),
substr(num_text,3,1),
lpad(substr(num_text,5,2),2,'0')
) as x
from table
输出应该是:
id x
--------------
1 0403
2 0402
3 0415
4 0423
上面的示例是针对简单模式的。如果您有更复杂或更大的模式,例如 1.23.23.123
或 12.1.34.234
,您需要更多 mysql string function,例如 LPAD
、SUBSTR
等
我有一个层次结构 table,里面有一些数据。我已经以分层方式对它们进行了排序,但其中存在一个错误。我使用一个名为 Path
的字段来执行此操作。让我们先看看 table :
这里的问题是 mysql 将每对路径作为文本进行比较。如果你看最后两行,15 比 6 大,应该与它下面的行交换。
我的问题是如何将路径的每一部分作为由点分隔的数字进行比较?
你可以做的是为路径的每一步使用两位数字,即代替 0.4.6
保存 0.04.06
,它小于 0.04.15
除此之外我要做的是使用以下公式将路径转换为数字
0.1.7.9.10.13 -> 0.1791013
乘以 10000000
0.1791013 * 10000000 = 1791013
这里有一个小窍门:
SELECT INET_ATON('0.4.15')a,INET_ATON('0.4.6')b;
+--------+--------+
| a | b |
+--------+--------+
| 262159 | 262150 |
+--------+--------+
假设您有这样的示例数据:
id num_text
---------------
1 0.4.3
2 0.4.2
3 0.4.15
4 0.4.23
这是您需要的查询:
select *
from table
order by concat(
substr(num_text,1,1),
substr(num_text,3,1),
lpad(substr(num_text,5,2),2,'0')
) asc
示例输出:
id num_text
---------------
2 0.4.2
1 0.4.3
3 0.4.15
4 0.4.23
解释:
首先,您需要使每个值具有相同的长度。例如,我们转换0.4.2 to 0402, 0.4.3 to 0403
,等等。所以这个查询:
select id,
concat(
substr(num_text,1,1),
substr(num_text,3,1),
lpad(substr(num_text,5,2),2,'0')
) as x
from table
输出应该是:
id x
--------------
1 0403
2 0402
3 0415
4 0423
上面的示例是针对简单模式的。如果您有更复杂或更大的模式,例如 1.23.23.123
或 12.1.34.234
,您需要更多 mysql string function,例如 LPAD
、SUBSTR
等