MYSQL和查询在同一列上满足

vis*_*ion 26 php mysql sql

项目目标:

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

以下是我的 table structure

我有以下 tables

公共汽车

id | bus_name
Run Code Online (Sandbox Code Playgroud)

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

路线

id | route_name
Run Code Online (Sandbox Code Playgroud)

表格描述: 存储所有城市名称

停止

id | stop_name
Run Code Online (Sandbox Code Playgroud)

表格描述: 所有停止名称

stop_orders

id | route_id | stop_id | stop_order
Run Code Online (Sandbox Code Playgroud)

表格描述:这里我将为city和stop_order列分配句点,帮助识别彼此相邻的站点

bus_timing

id | stop_order_id | bus_id | bus_timing | trip | trip_direction
Run Code Online (Sandbox Code Playgroud)

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

输出期望:

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

  2. 如果没有直达公交车那么应该显示相互连接的公交

例如,如果用户之间寻找stop_8stop_1801:00:0012:00:00那么随着时间的推移应该show.if直达巴士不在那里所有巴士名单两个站之间的旅行,然后相互连接的链路总线列表应该显示

输出我得到的是

PHP比较基于条件的关联数组

现在的返回结果问题是

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

  2. 即使我不知道如何找到互连的公交车名单

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

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

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)

这将返回具有两个城市名称的停靠点的公交车.

鉴于公交车可以有很多停靠点,它可能更有效:

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;
Run Code Online (Sandbox Code Playgroud)

  • @vision...您应该将新问题作为新问题提出,而不是在评论中 - 并且在回答问题后您不应对问题进行根本性更改. (4认同)

Eva*_*oll 13

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

这是一类称为路由问题的问题..对于它,你需要一个更好的工具:考虑迁移或集成PostgreSQL,并特别检查PgRouting你可能会想要Dijkstra的最短路径.PgRouting运行在PostGIS扩展的顶部.

或者,考虑与Esri合作.

或者你可以搞乱这个,但我不建议.

OQgraph(更新)

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

  • 或者使用带有MySQL的OQgraph数据库引擎 (2认同)