通过SQL查询查找路径

时间:2017-08-29 07:47:50

标签: mysql sql sqlite

我创建了一个非常大的数据库和一个漂亮且有效的应用程序 一切都按要求/需要工作 现在我想从数据库中的表中选择一些项目,将它们放入我在我的应用程序中实现的自定义回收站视图中。
所以我的问题是:

让这张地图的东西 enter image description here
表格如下:
enter image description here

如何使用表格并使用输入 2 来获得以下结果E

2 - > C - > D - > 电子

通常,可以使用select Name from table where line=1之类的查询来选择整行 EDIT1 - 您可以在SQLFiddle.com

上找到此示例

EDIT2 - 正如评论中所述,我不是在寻找最短的路径,而是寻找一条不会出现过多次的路径。您可以将此理解为地铁路线示例,其中您想知道从A站到B站的路线 路线的长度是我稍后会弄清楚的,但现在我想要一个想法(查询)来得到我想要的东西。如果您可以建议实现两者的方法,那么也将受到赞赏。

1 个答案:

答案 0 :(得分:1)

我不确定您的数据库结构是否可维护,在我看来,在某个地方中间添加一个电台将是一场噩梦。 “可以从”信息中获取信息不应该在索引中... ...

我依赖你的断言“我不是在寻找最短的路径。”,我认为这也意味着效率通常不那么重要(否则在SQL之上使用编程语言来实现推荐的算法之一在评论中)。即我做了一个鲁莽的暴力概念。

所以这是一个提案 (请注意,这是SQLite,但我怀疑MySQL无法执行任何SQLite查询  并且不喜欢小提琴,我有麻烦接受我正在使用的递归构造的小提琴......):

with reachable(fromname, toname)
as (
    select a.name, b.name
    from table1 a INNER JOIN table1 b
    on a.id+1 = b.id and a.color = b.color
    UNION ALL
    select a.name, b.name
    from table1 a INNER JOIN table1 b
    on a.id = b.id+1 and a.color = b.color
),
distance (name, dist, path)
as (
select 'E', 0, 'E'
UNION ALL
select a.fromname, b.dist+1, a.fromname||'->'||b.path
from reachable a INNER JOIN distance b
on a.toname = b.name and instr(b.path, a.fromname) =0
)
select path from distance where name = '2';

详细说明:

  • 制作一个可达的CTE,哪个站可以直接到达哪个,
    方向信息,with reachable ...
  • 进行递归CTE以确定路径和距离,
    with distance ...
  • 连接路径
    a.fromname||'->'||b.path
  • 忽略已经在路径中的站点 instr(b.path, a.fromname) =0
  • 每个站(蛮力)
  • 忽略已在路径中的电台
  • start位于此代码where name = '2'
  • 目标是,两次,这里select 'E', 0, 'E',0是固定的

输出:

2->C->D->E

试验:

  • 2-> E:2->C->D->E
  • 4-> E:4->C->D->E
  • 4-> B:4->C->B
  • 2-> B:2->C->B

使用:SQLite 3.18.0 2017-03-28