Mysql查询从几个表中加入数据

时间:2014-03-29 22:31:15

标签: mysql sql database

db有4个表,下面是每个表定义和一些样本数据。

停止时间(这代表特定行程中某条公共汽车的特定'停止)

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';

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分: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到stop_times,这样你的id就可以匹配,并且每次相应的行程都有止损。