2014-03-29 66 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