括号中有三个表和属性:
route_id和stop_id是引用路由中主键的外键,分别停止。现在给定一个stop_name可以落在多个路由中并说我从包含from stop_name字段和stop_name字段的表单查询,如何根据我查询的输入参数获取显示路由名称和停止名称的结果。
由于
我会试着改写它。我正在开发一个旅行计划器应用程序,其中我希望通勤者以包含FROM(origin stop_name)和TO(目标stop_name)的形式输入两个参数,例如从(纽约市)到(布法罗)。基于我的问题中的表格信息,我希望通勤者获得结果,假设可能有多条路线到达他/她的目的地。我希望这会有所帮助。
答案 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 演示