查询旅行计划表

时间:2014-12-28 20:32:19

标签: mysql

括号中有三个表和属性:

  • route(route_id,route_name)
  • routestop(route_id,stop_id)
  • 停止(stop_id,stop_name)
路由停止中的

route_id和stop_id是引用路由中主键的外键,分别停止。现在给定一个stop_name可以落在多个路由中并说我从包含from stop_name字段和stop_name字段的表单查询,如何根据我查询的输入参数获取显示路由名称和停止名称的结果。

由于

我会试着改写它。我正在开发一个旅行计划器应用程序,其中我希望通勤者以包含FROM(origin stop_name)和TO(目标stop_name)的形式输入两个参数,例如从(纽约市)到(布法罗)。基于我的问题中的表格信息,我希望通勤者获得结果,假设可能有多条路线到达他/她的目的地。我希望这会有所帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在寻找的此类查询称为“set-within-sets”。

接近它的一种方法是使用GROUP BY聚合(在您的情况下按路由)并在HAVING子句中检查条件(确保两个停靠点都在路由中)。

假设您在客户端代码中获得stop_id(例如,origin stop_id为1且目标stop_id为3),如果您只对路径信息感兴趣,则查询可能会显示为

SELECT r.*
  FROM route_stop rs JOIN routes r
    ON rs.route_id = r.route_id
 WHERE rs.stop_id IN(1,3)
 GROUP BY rs.route_id
HAVING MAX(rs.stop_id = 1) + 
       MAX(rs.stop_id = 3) = 2 -- both stop_ids should be present for each route

示例输出:

| ROUTE_ID | ROUTE_NAME |
|----------|------------|
|        1 |     route1 |
|        2 |     route2 |

这是 SQLFiddle 演示

如果你想看到路线和所有站点

SELECT r.*, GROUP_CONCAT(s.stop_name) stops
  FROM
(
  SELECT route_id
    FROM route_stop
   WHERE stop_id IN(1,3)
   GROUP BY route_id
  HAVING MAX(stop_id = 1) + 
         MAX(stop_id = 3) = 2
) q JOIN route_stop rs 
    ON q.route_id = rs.route_id JOIN routes r
    ON rs.route_id = r.route_id JOIN stops s
    ON rs.stop_id = s.stop_id
 GROUP BY rs.route_id

示例输出:

| ROUTE_ID | ROUTE_NAME |             STOPS |
|----------|------------|-------------------|
|        1 |     route1 | stop5,stop3,stop1 |
|        2 |     route2 | stop1,stop3,stop2 |

这是 SQLFiddle 演示