MySQL两个节点之间的最短路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL两个节点之间的最短路径相关的知识,希望对你有一定的参考价值。
我有如下定义的mysql表:
SELECT * FROM paths
source | destination
1 | 2
1 | 3
2 | 4
4 | 5
3 | 5
我试图找到1到5之间的最短路径,并且不确定哪个SQL查询会得到该结果。这就是我现在所拥有的:
WITH RECURSIVE cte AS
(
SELECT destination, CAST(destination AS CHAR(200)) AS path
FROM paths WHERE source = 1
UNION ALL
SELECT c.destination, CONCAT(cte.path, ",", c.destination)
FROM paths c JOIN cte ON cte.destination=c.source
)
SELECT * FROM cte ORDER BY path;
我不确定如何将上述查询限制为仅找到以5结尾的路径。我正在寻找的示例:
1至5之间的所有路径:
- ((1-> 2),(2-> 4),(4-> 5)
- ((1-> 3),(3-> 5)
在这种情况下,我希望查询返回的最短路径是第二个选项。
答案
您不太远。只需在递归中添加路径的长度即可。然后过滤目标节点的最终结果,并使用ORDER BY
路径的长度和LIMIT
仅获得一条最短的路径(如果有多个具有最小长度的路径,则随机选择其中一条)。
WITH RECURSIVE
cte
AS
(
SELECT p.destination,
concat(p.source, '->', p.destination) path,
1 length
FROM paths p
WHERE p.source = 1
UNION ALL
SELECT p.destination,
concat(c.path, '->', p.destination) path,
c.length + 1 length
FROM cte c
INNER JOIN paths p
ON p.source = c.destination
WHERE c.destination <> 5
)
SELECT c.path
FROM cte c
WHERE c.destination = 5
ORDER BY c.length
LIMIT 1;
您可能会考虑的一件事是循环处理,如果图形中可能存在循环。除非节点5处于这种循环中,否则您将有无限的递归。
以上是关于MySQL两个节点之间的最短路径的主要内容,如果未能解决你的问题,请参考以下文章