如何临时保存查询结果,以用于另一个?


12

我有这个问题,我想您可能会帮助我。
PS:我不确定如何称呼它,所以如果有人找到一个更合适的标题,请进行编辑。

背景

  • 我正在使用此应用程序搜索公交线路。
  • 总线是3位数字,并且是唯一的,永远不会改变。
  • 要求是能够搜索从站点A到站点B的线路。
  • 用户界面已经成功提示用户仅使用有效的站点名称。
  • 要求是能够显示一条路线是否有一条直线,如果没有,则显示2条甚至3条线的组合。

例:

我需要从A点到达D点。该程序应显示:

  • 如果有一条直线AD。
  • 如果不是,则显示2行组合,例如AC,CD。
  • 如果没有任何2行组合,请搜索3行组合:AB,BC,CD。

当然,该应用程序应显示总线线路号以及何时切换总线。

是)我有的:

我的数据库结构如下(简化后,实际的数据库包括位置和时间等信息):

+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+

+-------------------------------+
|    lines_stops_relationship   |
+-------------+---------+-------+
|  bus_line   | stop_id | order |
+-------------+---------+-------+

在哪里lines_stops_relationship描述公交线路和车站之间的多对多关系。

顺序,表示止损单行显示的顺序。并非所有的行都来回移动,并且顺序具有含义(顺序2的A点在顺序1的B点之后)。

问题

  • 我们找出一条线是否可以轻松通过该路线。只需搜索一条以正确顺序穿过两个点的直线。
  • 如何找到2/3线组合?我当时想搜索一条与源站点相匹配的线,与目标站点相匹配的线,以查看是否可以在它们之间找到一个公共站点,以便用户可以切换公交车。我怎么记得那站?
  • 3行组合更加棘手,我找到了一条线作为源,一条线用于目的地,然后呢?我想搜索一条有2个停靠点的线,但是,如何记住停靠点?

tl; dr

我如何记住查询结果才能再次使用?我希望在单个查询中实现此目的(对于每个查询,都是针对1行路线的查询,针对2行的查询以及针对3行组合的查询)。

注意:我不介意有人建议使用与我完全不同的方法,我愿意接受任何解决方案。

将通过cookie和upvote奖励任何帮助。提前致谢!



@eggyal:我在节点之间没有距离。另外,我在网络内部的移动受到限制(即,只有某些总线从A点移动到B点)。还是对我有用吗?
马达拉的鬼魂

我还建议对此使用单个查询的存储过程-如果甚至可以通过单个查询来执行。您可以在那里轻松存储结果/变量并重复使用它们。

1
@Truth最好给你一些东西:mysqltutorial.org/stored-procedures-loop.aspx(循环),mysqltutorial.org/…(案例)-与类似dijkstra算法的东西结合,您应该能够解决您的问题问题。基本上,这就像一个php函数-但是在mysql上

1
似乎已经在Stack Overflow上 -此链接具有多个解决方案,尽管此时MySQL中还没有。(有几个答案很难概括,链接腐烂可能不是问题,因为如果该站点消失了,这个问题也可能会解决。此外,它还有很多支持)。
psr 2012年

Answers:


3

您可能不想在此时进行如此大的更改,但是您所描述的正是Graph Databases的用例。图形数据库基于图形理论,您正在尝试通过公交路线的有向图来查找“ X”和“ Y”之间的路径,从而触及到这一点。

如果您尚未研究过,请浏览一下Neo4J之类的东西。它具有REST API,您可以找到它的PHP客户端

您会发现很多Stack Overflow的人可以帮助实现事情。


1
我目前处于思考阶段,我可以进行任何更改。我会检查您的链接。同样,这个问题来自Stack Overflow,我知道他们可以帮助我实现它:)
Madara的Ghost

1
我打算建议递归查询,但是MySQL不支持这些查询,所以这个答案可能会更好。
FrustratedWithFormsDesigner 2012年

@FrustratedWithFormsDesigner可能有一个非常尴尬的MySQL解决方案,它将SP和邻接列表结合在一起,但是我认为这甚至不值得花时间考虑。
扬尼斯,2012年

@YannisRizos:也许这是一个很好的高尔夫挑战代码,也许吗?;)
FrustratedWithFormsDesigner 2012年

1
@FrustratedWithFormsDesigner Nah,这是一个很好的高尔夫挑战代码
yannis 2012年

0

假设用户想要从$start_id转到$end_id(均为有效stop_id值)。您可以使用以下查询找到从$start_id到的有效路线$end_id

  1. 搜索直接路线(单行):

    SELECT *
    FROM bus_stops bs1, bus_stops bs2
    WHERE bs1.stop_id=$start_id AND bs2.stop_id=$end_id AND bs1.bus_line=bs2.bus_line
    
  2. 如果上一个查询没有结果,请使用2个lignes搜索路线:

    SELECT *
    FROM bus_stops bs1, bus_stops bs2, bus_stops bs3, bus_stops bs4
    WHERE bs1.stop_id=$start_id
        AND bs1.bus_line=bs2.bus_line
    AND bs2.stop_id=bs3.stop_id
        AND bs3.bus_line=bs4.bus_line
    AND bs4.stop_id=$end_id
    

替换*为您真正需要检索的字段。


您好Jocelyn,欢迎您!请仔细阅读我们的编辑帮助页面,以了解如何充分利用Markdown。这次我已经编辑了您的答案,您可以查看其修订历史,以查看我进行了哪些编辑。
yannis 2012年

为什么连续从同一个数据库中选择4次?
马达拉的鬼魂

如果您需要条公交线路(bus_stops bs5)来完成路线,会发生什么情况?
FrustratedWithFormsDesigner 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.