【问题标题】:path finding via SQL Query通过 SQL 查询进行路径查找
【发布时间】:2017-08-29 07:47:49
【问题描述】:

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

让这张地图的东西。

表格如下:


如何使用表格并使用输入 2E 来实现以下结果.

2 - > C -> D -> E

通常,可以使用select Name from table where line=1 之类的查询来选择整行。

EDIT1 - 你可以在SQLFiddle.com找到这个例子

EDIT2 - 如评论中所述,我不是在寻找最短路径,而是在寻找不止一次出现的路径。您可以将此理解为地铁路线示例,其中一个人想知道从 A 站到 B 站的路线。
路线的长度是我稍后会弄清楚的,但现在我想要一个想法(查询)来得到我想要的。如果您能提出一种实现这两种方法的方法,那也将不胜感激。

【问题讨论】:

  • 您正在寻找无向图中的最短路径。试试 A* 或 BFS。
  • 请提出一些建议,反对票不是必需的答案。
  • 这个问题需要算法,而不是(单个)查询。
  • 请不要发布数据图片。人们可能想玩弄它,但不必重新创建它。我们想要一些我们可以复制的东西......在一个完美的世界里,你会创建一个sqlfiddle.com
  • 是的,你可以自己研究一下。您会发现它是计算中的“难题”之一。

标签: mysql sql sqlite


【解决方案1】:

我不确定您的数据库结构是否可维护,在我看来,在某处中间添加一个站点将是一场噩梦。 “可从”信息不应包含在索引中...

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

所以这是一个建议
(请注意,这是 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
  • 每个站点(蛮力)
  • 忽略路径中已经存在的站点
  • 开始在此代码中where name = '2'
  • 目标是,两次,这里select 'E', 0, 'E',0是固定的

输出:

2->C->D->E

测试:

  • 2->电子邮箱:2->C->D->E
  • 4->电子邮箱:4->C->D->E
  • 4->B:4->C->B
  • 2->B:2->C->B

使用:SQLite 3.18.0 2017-03-28

【讨论】:

  • 我无法在任何地方执行它。
  • 我不确定我是否理解您的问题。您正在使用 SQLite 对 SQLite 数据库进行查询,不是吗?你应该有命令行工具来玩/实验纯 SQLite 语法。否则下载它,它是免费的、免费的并且非常有用。
  • 你有数据库吗?
  • 是的,我喜欢,很大。
  • 因此,从命令行工具打开您的数据库,并读取包含建议的 sql 查询的文件。 dot-command .read 为您执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-03-03
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多