如何在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.12312.1.34.234,您需要更多 mysql string function,例如 LPADSUBSTR