MYSQL和查询在同一列

时间:2017-11-07 17:35:01

标签: php mysql sql

项目目标:

我们正在开发用户将搜索公交车的公交车时刻Api

以下是我的table structure

我关注tables

巴士

id | bus_name

表格说明:存储所有公交车名称

路线

id | route_name

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

停止

id | stop_name

表格说明:所有停止名称

stop_orders

id | route_id | stop_id | stop_order

表格说明:在这里,我将为city和stop_order列分配帮助,以确定彼此相邻的停靠点

bus_timing

id | stop_order_id | bus_id | bus_timing | trip | trip_direction

表格说明:在这里,我将为路线停靠分配巴士以及时间和行程及方向

输出预期:

  1. 当用户在时间点之间搜索源到目的地时,Api必须随时间返回所有公交车列表

  2. 如果没有直达巴士那么互联的巴士应该显示

  3. 例如,如果用户在stop_8stop_1801:00:0012:00:00之间进行搜索,那么所有的公交车列表都会显示出来。如果直接公共汽车没有在两个之间旅行然后停止互连链路总线列表应显示

    输出我得到的是

    PHP compare associative array based on condition

    目前的返回结果问题是

    1. 即使公共汽车只前往stop_8而不是stop_18,它也将返回所有公共汽车。但我的结果必须只返回那些将在两站之间行驶的公共汽车,我的意思是它必须落在两站之间。

    2. 即使我不知道如何找到互联巴士列表

    3. 当时间范围很长时,可能会有多次相同的公共汽车行驶(行程和方向)

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

2 个答案:

答案 0 :(得分:20)

因为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;

答案 1 :(得分:13)

  

如果公共汽车没有直接在两个城市之间旅行,那么我需要显示相互连接的公共汽车。

这是一类名为routing problems.的问题中的一个大问题。为此,您需要一个更好的工具:考虑迁移或集成PostgreSQL,并特别检查PgRouting您可能想要Dijkstra的最短路径。 PgRouting在PostGIS扩展程序上运行。

Or, consider working on integrating with Esri

或者你可以mess around with this,但我不建议。

OQgraph(更新)

在评论中的symcbean中,您也可以使用"OQgraph database engine"来执行此操作。有一个shortest path here的例子。