【问题标题】:MYSQL AND query to satisfy on same columnMYSQL AND 查询满足同一列
【发布时间】:2018-04-20 05:16:39
【问题描述】:

项目目标:

我们正在开发公交车计时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. 如果没有直接总线,则应显示互连总线

例如,如果用户在 stop_8stop_1801:00:0012:00:00 之间搜索,则应显示所有带时间的巴士列表。如果没有直达巴士在两个站点之间行驶,则应显示互连的链接巴士列表

输出我得到的是

PHP compare associative array based on condition

目前返回结果问题是

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

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

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

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

【问题讨论】:

  • 更新您的问题并添加预期结果
  • @vision 你也可以举一些数据例子吗?我认为这将有助于回答这个问题。包括 2 个查询的结果示例。
  • 在提供赏金之前,您至少应该提供一些示例数据和您想要的结果。 ...您想在 PostgreSQL 中看到答案,还是想看到在 MySQL 中完成工作的烂摊子?
  • 你还没有给minimal reproducible example。使您的问题自成一体,不要依赖链接。当您可以将文本放入您的问题时,也不要使用图像/链接。还要编辑您的问题,使其从上到下正确阅读,并尽可能避免“更新”,使其尽可能清晰和最新。并且不要更改问题以使答案无效,将其编辑为最好的答案,然后提出新问题。

标签: php mysql sql


【解决方案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;

【讨论】:

  • @Gordon.Thanks 工作正常。我还有一个问题假设如果没有从悉尼到梅尔本的直达巴士,我们如何显示连接的巴士
  • @vision 。 . .您应该以新问题的形式提出新问题,而不是在 cmets 中——并且您不应该在问题得到回答后对其进行根本性的更改。
  • 。根据您的查询,只有第一辆巴士的详细信息,并非所有在两个城市之间行驶的巴士。我提出了新问题stackoverflow.com/questions/48030793/…
  • @Gordon.your answer is working when stop name is not repeating but when we add bus time then it will repeat so result is not as i expected
  • @vision 您已更改 Gordon 在您的回答中写的查询以删除 GROUP BY。此外,如果您使用示例数据创建 SQL fiddle,它将大大减少有人能够帮助您所需的工作,因此您可能会得到更多答案。
【解决方案2】:

另外,如果巴士不是直接在两个城市之间行驶,那么我需要显示相互连接的巴士。

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

Or, consider working on integrating with Esri.

您也可以mess around with this,但我不建议这样做。

OQgraph(更新)

从 cmets 中的 symcbean,您也可以使用 "OQgraph database engine" 来执行此操作。有shortest path here的例子。

【讨论】:

  • @Evan.Thanks for answer
  • 或者使用 MySQL 的 OQgraph 数据库引擎
  • @symcbean 老实说,我什至不知道它的存在。我期待在答案中看到它的使用。
  • @EvanCarroll.thanks for update.and quick response .
  • @EvanCarroll.ya 那是真的。我刚刚浏览了链接看起来不错。希望我会阅读并尝试这样做。再次感谢
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 2013-08-10
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多