我有两张桌子:线和点。线表表示两个点之间的互连。
行表有:
idLine idStartPoint idEndPoint . YL19197 YP004990 YP004991 YL19195 YP004989 YP004990 YL19199 YP004991 YP004992 .
点数表有:
idPoint Feed ...
YP004990 0
YP004989 0
YP004991 0
....... ...
YP005214 1只有idLine值时,我需要遍历基于idStartPoint和idEndPoint的所有行,直到出现提要值为'1‘的点为止。
现在我这样做了(假设idLine是YL19197)
从idStartPoint=‘and 004990’和idLine <> 'YL19197‘的行中选择* 从idEndPoint=‘and 004990’和idLine <> 'YL19197‘的行中选择* 从idStartPoint=‘and 004991’和idLine <> 'YL19197‘的行中选择* 从idEndPoint=‘and 004991’和idLine <> 'YL19197‘的行中选择*
这让我回想起两句话:
idLine idStartPoint idEndPoint
YL19195 YP004989 YP004990
YL19199 YP004991 YP004992但我需要所有连接起来的线路,直到我找到一个点为“feed=1”的线路。
图形表示:

发布于 2017-09-27 18:24:54
MySQL直到8.0.1版本才支持递归查询。
这应该是可行的:
WITH RECURSIVE r(idLine, idStartPoint, idEndPoint) AS (
SELECT idLine, idStartPoint, idEndPoint
FROM line WHERE idLine='YL19197'
UNION ALL
SELECT l.idLine, l.idStartPoint, l.idEndPoint
FROM r JOIN line l ON l.idStartPoint = r.idEndPoint
JOIN points p ON p.idPoint = r.idEndPoint
WHERE p.feed = 0
)
SELECT * FROM r;输出您在问题中应该包含的数据:
+---------+--------------+------------+
| idLine | idStartPoint | idEndPoint |
+---------+--------------+------------+
| YL19197 | YP004990 | YP004991 |
| YL19199 | YP004991 | YP004992 |
+---------+--------------+------------+您的测试数据似乎没有足够的行来演示使用feed=1终止的情况。
如果您使用的MySQL版本早于8.0.1,则必须采用另一种方法。最简单的方法是编写应用程序代码,为一行运行一个查询,然后检查结果是否是您要查找的端点,如果不是,则循环并为下一行进行另一个查询。
https://stackoverflow.com/questions/46454277
复制相似问题