首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql递归查询互连线

Mysql递归查询互连线
EN

Stack Overflow用户
提问于 2017-09-27 17:53:44
回答 1查看 86关注 0票数 1

我有两张桌子:线和点。线表表示两个点之间的互连。

行表有:

idLine idStartPoint idEndPoint . YL19197 YP004990 YP004991 YL19195 YP004989 YP004990 YL19199 YP004991 YP004992 .

点数表有:

代码语言:javascript
复制
     idPoint  Feed ...
     YP004990   0
     YP004989   0
     YP004991   0
     .......   ...
     YP005214   1

只有idLine值时,我需要遍历基于idStartPoint和idEndPoint的所有行,直到出现提要值为'1‘的点为止。

现在我这样做了(假设idLine是YL19197)

  • 搜索YL19197行并带来idStartPoint (YP004990)和idEndPoint (YP004991)
  • 生成一个查询,该查询将连接到YL19197的两行(而不带回YL19197):

从idStartPoint=‘and 004990’和idLine <> 'YL19197‘的行中选择* 从idEndPoint=‘and 004990’和idLine <> 'YL19197‘的行中选择* 从idStartPoint=‘and 004991’和idLine <> 'YL19197‘的行中选择* 从idEndPoint=‘and 004991’和idLine <> 'YL19197‘的行中选择*

这让我回想起两句话:

代码语言:javascript
复制
idLine idStartPoint idEndPoint

YL19195 YP004989 YP004990

YL19199 YP004991 YP004992

但我需要所有连接起来的线路,直到我找到一个点为“feed=1”的线路。

图形表示:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-27 18:24:54

MySQL直到8.0.1版本才支持递归查询。

这应该是可行的:

代码语言:javascript
复制
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;

输出您在问题中应该包含的数据:

代码语言:javascript
复制
+---------+--------------+------------+
| idLine  | idStartPoint | idEndPoint |
+---------+--------------+------------+
| YL19197 | YP004990     | YP004991   |
| YL19199 | YP004991     | YP004992   |
+---------+--------------+------------+

您的测试数据似乎没有足够的行来演示使用feed=1终止的情况。

如果您使用的MySQL版本早于8.0.1,则必须采用另一种方法。最简单的方法是编写应用程序代码,为一行运行一个查询,然后检查结果是否是您要查找的端点,如果不是,则循环并为下一行进行另一个查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46454277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档