我正在使用Rennes的数据(该页面的第二个 zip 文件)和这个表模式。
这是我的第一个查询,它列出了一条路线的停靠点(从该路线的第一次旅行开始):
select
first_trip_of_route.trip_id,
st.stop_id,
s.stop_name
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
left join stops s on s.stop_id = st.stop_id
order by st.stop_sequence;
它有效,这里是雷恩 33 路公交车的站点:
+---------+---------+----------------------+
| trip_id | stop_id | stop_name |
+---------+---------+----------------------+
| 2420 | 2220 | Gautrais |
| 2420 | 2221 | Rossel |
| 2420 | 2234 | Pommerais |
| 2420 | 2223 | Abbé Grimault |
| 2420 | 2232 | Morinais |
| 2420 | 2202 | Collège Jean Moulin |
| 2420 | 2214 | Médiathèque |
| 2420 | 2204 | Jean Marin |
| 2420 | 2263 | Jean Jaurès |
| 2420 | 2205 | Blosne |
| 2420 | 2225 | Gaité |
| 2420 | 2230 | Rablais Allende |
| 2420 | 2227 | Croix Verte |
| 2420 | 2271 | 25 Fusillés |
| 2420 | 1454 | Bréquigny Piscine |
| 2420 | 1455 | Lycée Bréquigny |
| 2420 | 1456 | Coubertin |
| 2420 | 1457 | Norvège |
| 2420 | 1130 | Canada |
| 2420 | 1623 | Alma |
| 2420 | 1459 | Henri Fréville |
| 2420 | 1460 | Argonautes |
| 2420 | 1461 | Clemenceau |
| 2420 | 1462 | Combes |
| 2420 | 1464 | Binquenais |
| 2420 | 1463 | Binquenais Collège |
| 2420 | 1465 | Triangle |
| 2420 | 1353 | Torigné |
| 2420 | 1466 | Hôpital Sud |
| 2420 | 1467 | Le Blosne |
| 2420 | 1356 | Galicie |
| 2420 | 1468 | La Poterie |
| 2420 | 3020 | Val Blanc |
| 2420 | 3021 | Rocade Sud |
| 2420 | 3008 | Loges |
| 2420 | 3009 | Chantepie Mairie |
| 2420 | 3010 | Chantepie Eglise |
| 2420 | 3022 | Hallouvry |
| 2420 | 3017 | IDEFS |
| 2420 | 3016 | Cucé |
+---------+---------+----------------------+
现在我想为每个站点添加该站点的可用路线。
首先我连接了stop_id
s,但不幸的是,雷恩决定,如果停靠点不是同一栋建筑,那么即使它有 10 米宽,它也不是同一个停靠点。实际上这是有道理的,但这并没有让我们的生活更轻松:)
所以我尝试连接停止名称。这是一个示例Alma
:
mysql> select stop_id, stop_name from stops where stop_name = 'Alma';
+---------+-----------+
| stop_id | stop_name |
+---------+-----------+
| 1622 | Alma |
| 1623 | Alma |
+---------+-----------+
2 rows in set (0.04 sec)
凉爽的。在那个站点找到可用的路线怎么样?
mysql> select r2.route_id as route_id,
s2.stop_name as stop_name
from stops s2
left join stop_times st2 on st2.stop_id = s2.stop_id
left join trips t2 on t2.trip_id = st2.trip_id
left join routes r2 on r2.route_id = t2.route_id
where s2.stop_name = 'Alma'
group by r2.route_id;
+----------+-----------+
| route_id | stop_name |
+----------+-----------+
| 0003 | Alma |
| 0033 | Alma |
+----------+-----------+
2 rows in set (0.13 sec)
伟大的。当我们在时Alma
,我们可以乘坐3路或33路公交车。
现在让我们将这两个查询混合在一起:
select
first_trip_of_route.trip_id,
st.stop_id,
s.stop_name,
connections.route_id
from (
select
t.trip_id,
r.route_long_name
from routes r
left join trips t on t.route_id = r.route_id
where r.route_id = '0033'
limit 1
) as first_trip_of_route
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
left join stops s on s.stop_id = st.stop_id
left join (
select
r2.route_id as route_id, s2.stop_name as stop_name
from stops s2
left join stop_times st2 on st2.stop_id = s2.stop_id
left join trips t2 on t2.trip_id = st2.trip_id
left join routes r2 on r2.route_id = t2.route_id
group by r2.route_id
) connections
on connections.stop_name = s.stop_name
order by st.stop_sequence
它适用于大多数站点,但正如您所见,它表示 Alma 中没有连接:
+---------+---------+----------------------+----------+
| trip_id | stop_id | stop_name | route_id |
+---------+---------+----------------------+----------+
| 2420 | 2220 | Gautrais | NULL |
| 2420 | 2221 | Rossel | NULL |
| 2420 | 2234 | Pommerais | NULL |
| 2420 | 2223 | Abbé Grimault | NULL |
| 2420 | 2232 | Morinais | NULL |
| 2420 | 2202 | Collège Jean Moulin | NULL |
| 2420 | 2214 | Médiathèque | NULL |
| 2420 | 2204 | Jean Marin | NULL |
| 2420 | 2263 | Jean Jaurès | NULL |
| 2420 | 2205 | Blosne | NULL |
| 2420 | 2225 | Gaité | NULL |
| 2420 | 2230 | Rablais Allende | NULL |
| 2420 | 2227 | Croix Verte | NULL |
| 2420 | 2271 | 25 Fusillés | NULL |
| 2420 | 1454 | Bréquigny Piscine | NULL |
| 2420 | 1455 | Lycée Bréquigny | NULL |
| 2420 | 1456 | Coubertin | 0213 |
| 2420 | 1456 | Coubertin | 0212 |
| 2420 | 1457 | Norvège | NULL |
| 2420 | 1130 | Canada | 0033 |
| 2420 | 1623 | Alma | NULL | <<< WTF?
| 2420 | 1459 | Henri Fréville | 0037 |
| 2420 | 1459 | Henri Fréville | 0159 |
| 2420 | 1459 | Henri Fréville | 0074 |
| 2420 | 1459 | Henri Fréville | 0172 |
| 2420 | 1459 | Henri Fréville | 0079 |
| 2420 | 1460 | Argonautes | NULL |
| 2420 | 1461 | Clemenceau | NULL |
| 2420 | 1462 | Combes | NULL |
| 2420 | 1464 | Binquenais | NULL |
| 2420 | 1463 | Binquenais Collège | NULL |
| 2420 | 1465 | Triangle | 0061 |
| 2420 | 1465 | Triangle | 0161 |
| 2420 | 1353 | Torigné | NULL |
| 2420 | 1466 | Hôpital Sud | NULL |
| 2420 | 1467 | Le Blosne | NULL |
| 2420 | 1356 | Galicie | NULL |
| 2420 | 1468 | La Poterie | 0214 |
| 2420 | 1468 | La Poterie | 0075 |
| 2420 | 1468 | La Poterie | 0173 |
| 2420 | 1468 | La Poterie | 0073 |
| 2420 | 3020 | Val Blanc | NULL |
| 2420 | 3021 | Rocade Sud | NULL |
| 2420 | 3008 | Loges | NULL |
| 2420 | 3009 | Chantepie Mairie | NULL |
| 2420 | 3010 | Chantepie Eglise | NULL |
| 2420 | 3022 | Hallouvry | NULL |
| 2420 | 3017 | IDEFS | NULL |
| 2420 | 3016 | Cucé | NULL |
+---------+---------+----------------------+----------+
是什么赋予了?