2014-03-29 67 views
0

db有4个表,下面是每个表的定义和一些示例数据。Mysql查询连接来自多个表的数据

停止时间(这表示在特定行程的特定“停止”为一个总线沿路线)

trip_id arrival_time departure_time stop_id  stop_sequence 
1  06:54:00  06:54:00  9400ZZMAABM1 0001 
1  06:56:00  06:56:00  9400ZZMACRU1 0002 
1  06:58:00  06:58:00  9400ZZMABOW1 0003 
1  07:00:00  07:00:00  9400ZZMAHEA1 0004 
1  07:02:00  07:02:00  9400ZZMAPWC1 0005 

途径(这代表路由)

route_id  route_short_name route_long_name 
MET:MET2:I: 42     ALTRINCHAM - MANCHESTER - BURY 
MET:MET2:O: 42     BURY - MANCHESTER - ALTRINCHAM 

跳闸(这代表特定的总线跳闸)

route_id  trip_id trip_headsign 
MET:MET2:I: 1   "Bury To Manchester" 
MET:MET2:I: 2   "Manchester To Bury" 

停止(这代表了一个公共汽车站)

stop_id  stop_code stop_name 
0600MA0001 chegptg  "Broken Cross, Fallibroome Road (cnr)" 
0600MA0050 chegtjm  "Macclesfield, opp Tesco" 
0600MA0166 chemjat  "Knutsford, Sugar Pit Lane (cnr)" 

我想获得给定路线的所有车站。要做到这一点似乎我必须加入来自路线,旅行,停车和停车时间的数据,但我无法正确理解。下面是我试一下查询:

SELECT 
    routes.route_id, 
    routes.route_short_name, 
    trips.trip_id, 
    stops.stop_id, 
    stops.stop_name 
FROM routes 
    INNER JOIN trips ON routes.route_id=trips.route_id 
    INNER JOIN stops ON stop_times.stop_id=stops.stop_id 
WHERE routes.route_short_name='42'; 
+0

你必须加入你的stop_times表 –

回答

1

我相信这会为你工作

SELECT 
    DISTINCT(s.stop_id), 
    s.stop_name, 
    r.route_short_name 
FROM stops s 
    INNER JOIN stop_times st ON st.stop_id = s.stop_id 
    INNER JOIN trips t ON t.trip_id = st.trip_id 
    INNER JOIN routes r ON r.route_id=t.route_id 
WHERE r.route_short_name='42' 
GROUP BY s.stop_id; 

你正试图从一个不同的表ID不参加工作表。你首先必须加入stop_times去旅行,然后加入站点stop_times,这样你的id就会匹配起来,并且你有相应旅程的停靠点。

+0

这可以改变,这样它只给了我不同的stop_ids路线?它给了我很多很多的行(可能每个stop_time发生的路线) – brux

+0

是的,我只是编辑你:) –

+0

新的查询是需要很长时间才能运行!我应该在某处添加索引吗? – brux

1

你的连接使用stop_times,但是这不是from子句。您需要所有四个表:

SELECT r.route_id, r.route_short_name, t.trip_id, s.stop_id, s.stop_name 
FROM routes r INNER JOIN 
    trips t 
    ON r.route_id = t.route_id INNER JOIN 
    stop_times st 
    ON st.trip_id = t.trip_id INNER JOIN 
    stops s 
    on st.stop_id = s.stop_id 
WHERE r.route_short_name='42'; 
+0

我想得到一个路线的所有站点而不是所有的停留时间,这个查询给了我发生在路线上的每一个stop_time(很多结果),我只想要停止if可能的 – brux

+0

@brux。 。 。然后你会使用'select distinct'。 –

+0

谢谢。即时尝试加快查询现在,它需要80 +秒 – brux