【问题标题】:Mysql query joining data from several tablesMysql查询连接来自多个表的数据
【发布时间】:2014-03-29 22:31:14
【问题描述】:

数据库有 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

routes(这代表一条路线)

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

trips(这代表特定的巴士行程)

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

stops(这代表一个公共汽车站)

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

【问题讨论】:

  • 你必须加入你的 stop_times 表

标签: mysql sql database


【解决方案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 加入到 trips 中,然后将 stop 加入到 stop_times 中,这样您的 id 才能匹配,并且每次相应的行程都有停靠点。

【讨论】:

  • 可以改变它,使它只给我路线的不同 stop_ids 吗?它给了我很多很多行(可能是路线发生的每个 stop_time)
  • 新查询需要很长时间才能运行!我应该在某处添加索引吗?
  • 我改了一下再试一次
  • 如果它需要很长时间才能运行,那么这可能是您的索引设置方式的问题,也许可以尝试运行 EXPLAIN
  • 酷我删除了重复的索引,它真的很快。谢谢!
【解决方案2】:

您的联接使用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';

【讨论】:

  • 我想获得一条路线的所有停靠点,而不是所有的停靠点,这个查询给出了路线上发生的每个 stop_time(很多结果),如果可能的话,我只想要停靠点跨度>
  • @brux 。 . .然后你会使用select distinct
  • 谢谢。我现在正在尝试加快查询速度,需要 80 多秒
猜你喜欢
  • 2014-11-16
  • 2021-04-11
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多