MYSQL 和查询以满足同一列OQgraph (update)

2022-08-30 16:40:45

项目目标 :

我们正在开发公交车计时,用户将搜索公交车。Api

以下是我的table structure

我有以下tables

巴士

id | bus_name

表的说明:存储所有总线名称

路线

id | route_name

表的说明:存储所有城市名称

停止

id | stop_name

表的说明:所有停靠点名称

stop_orders

id | route_id | stop_id | stop_order

表的描述:在这里,我将为城市和stop_order列分配停靠点,以帮助确定哪个停靠点彼此相邻

bus_timing

id | stop_order_id | bus_id | bus_timing | trip | trip_direction

表的说明:在这里,我将为路线站点分配公共汽车以及时间,行程和方向

预期输出:

  1. 当用户随时间在源到目标之间搜索时,Api 必须返回所有带有时间的总线列表

  2. 如果直达巴士不在那里,那么互连的巴士应该显示

例如,如果用户在 to 与 之间搜索,则所有带有时间的总线列表都应显示。如果直接总线不在两个站点之间行驶,则互连链接总线列表应显示stop_8stop_1801:00:0012:00:00

输出我得到的是

PHP 基于条件比较关联数组

当前返回结果问题是

  1. 它将返回所有巴士,即使巴士只是旅行而不是。但我的结果必须只返回那些将在两个站点之间行驶的公共汽车,我的意思是它必须落在两个站点之间。stop_8stop_18

  2. 即使我不知道如何找到互连的总线列表

  3. 当时间范围很长时,同一辆巴士可能会多次行驶(行程和方向)

更新仍在寻找答案。现在给出的答案有一些点,所以提供赏金


答案 1

因为不能在同一行中有两个不同的值。stop_id

聚合是执行所需操作的一种方法:

SELECT b.bus_name
FROM buses b JOIN
     route_connect rc
     ON rc.busid = b.id JOIN
     stops s
     ON s.id = rc.stop_id
GROUP BY b.bus_name
HAVING SUM( s.stop_name = 'Sydney' ) > 0 AND
       SUM( s.stop_name = 'Melbourne' ) > 0;

这将返回停靠两个城市名称的公共汽车。

鉴于公共汽车可以有很多站点,这样做可能会更有效:

SELECT b.bus_name
FROM buses b JOIN
     route_connect rc
     ON rc.busid = b.id JOIN
     stops s
     ON s.id = rc.stop_id
WHERE s.stop_name in ('Sydney', 'Melbourne')
GROUP BY b.bus_name
HAVING COUNT(DISTINCT s.stop_name) = 2;

答案 2

此外,如果公共汽车不是直接在两个城市之间行驶,那么我需要显示相互连接的公共汽车。

这是一类称为路由问题的问题中的一个大问题。为此,您需要一个更好的工具:考虑迁移或集成PostgreSQL,并专门检查PgRouting,您可能会想要Dijkstra的最短路径。PgRouting 在 PostGIS 扩展模块上运行。

或者,考虑与 Esri 集成

或者,你可以搞砸这个,但我不会建议它。

OQgraph (update)

从注释中的symcbean中,您也可以使用“OQgraph数据库引擎”来执行此操作。这里有一个最短路径的例子


推荐