我使用Rennes(该页面为2nd zip file)和this tables schema的数据。
这是我的第一个查询,它列出了路线的停靠点(从该路线的第一次出发):
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
,但不幸的是雷恩决定,如果停靠点不是同一个建筑物,它就不是同一个站点,即使它位于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 |
+---------+---------+----------------------+----------+
是什么给出了?
答案 0 :(得分:0)
好的,这不是一个好问题。我最终没有按名字链接停靠点,而是按距离链接。这是我的最终查询,如果有人感兴趣的话......
select
first_trip_of_route.trip_id, first_trip_of_route.route_long_name,
st.stop_id,
st.departure_time,
s.stop_name,
connected_stops.stop_id as connected_stop_id, connected_stops.stop_name as connected_stop_name,
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat)))) as connected_stop_distance,
connected_routes.route_id as connected_route_id, connected_routes.route_long_name as connected_route_name
-- look for the 1st trip of that route
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
-- get the list of stops taken by that trip
left join stop_times st on st.trip_id = first_trip_of_route.trip_id
-- add info about the stops (stop name)
left join stops s on s.stop_id = st.stop_id
-- look for stops next to this one (200 meters)
left join (
select stop_id, stop_lat, stop_lon, stop_name
FROM stops connected_stops
) as connected_stops on
(6371000*acos(cos(radians(s.stop_lat))*cos(radians(connected_stops.stop_lat))*cos(radians(s.stop_lon)-radians(connected_stops.stop_lon))+sin(radians(s.stop_lat))*sin(radians(connected_stops.stop_lat))))
< 200
and connected_stops.stop_id <> s.stop_id
-- add all the vehicles that make those stops
left join stop_times connected_stop_times on connected_stop_times.stop_id = connected_stops.stop_id
-- get the trips of those vehicles
left join trips connected_trips on connected_trips.trip_id = connected_stop_times.trip_id
-- get the routes from which these trips belong
left join routes connected_routes on connected_routes.route_id = connected_trips.route_id
-- ensure we get only one connected route per stop 200 meters from the initial searched stop
group by s.stop_id, connected_stop_id, connected_route_id
order by st.stop_sequence;
这是一个有限的输出:
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
| stop_id | stop_name | connected_stop_id | connected_stop_name | connected_stop_distance | connected_route_id |
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
... many rows here ...
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0804 |
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0059 |
| 1130 | Canada | 1449 | Norvège | 185.0837104437 | 0033 |
| 1623 | Alma | 1622 | Alma | 65.261785846695 | 0003 |
| 1623 | Alma | 1622 | Alma | 65.261785846695 | 0033 |
| 1459 | Henri Fréville | 1447 | Henri Fréville | 97.6477727244322 | 0037 |
| 1459 | Henri Fréville | 1447 | Henri Fréville | 97.6477727244322 | 0033 |
... many rows here....
+---------+----------------------+-------------------+----------------------+-------------------------+--------------------+
166 rows in set (0.53 sec)
我们可以看到停止1623
'Alma'确实与1622
'Alma'(65米对面)相连,可用路线为0003
和0033