1

我是 MySql 和 sql 的新手。我不知道如何执行以下操作:

我有一个包含四个相关表格的巴士时刻表数据库:

stops (24,403 rows)
-------------------
stop_id   int(11)


stopTimes (12,073,459 rows)
---------------------------
trip_id         varchar(30)
stop_sequence   int(11)     // running sequence within the trip: 1-last
stop_id         int(11)

trips (320,395 rows) 
---------------------------
trip_id   varchar(30)
route_id  int(11)


routes (9,748 rows)
---------------------------
route_id            int(11)
agency_id           int(11)                     
route_short_name    varchar(10)

关系

  • 旅行路线:一对多
  • 到站次数:一对多
  • 停停次数:一对一

在这些表中,我想创建一个包含以下字段的新表“routeStops”:

routeStops (~100,000 rows)
---------------------------
route_id            int(11)
agency_id           int(11)                     
route_short_name    varchar(10)
stop_id   int(11)

它与停靠点之间存在一对多的关系。

是否有可以执行此操作的SQL 查询?

我应该向route_idstop_id添加索引以优化性能吗?我应该向trip_id 添加全文索引吗?

我对此很陌生,并会欣赏一些见解。

我正在使用 PHPMyAdmin 和一个相当新的 XAMPP 安装。

tnx,

4

2 回答 2

1

像这样的东西应该工作:

SELECT r.route_id
     , r.agency_id 
     , r.route_short_name
     , s.stop_id
  FROM stopTimes s
  JOIN trips t
    ON t.trip_id = s.trip_id
  JOIN routes r
    ON r.route_id = t.route_id
 GROUP
    BY r.route_id
     , r.agency_id 
     , r.route_short_name
     , s.stop_id
 ORDER
    BY r.route_id
     , r.agency_id 
     , r.route_short_name
     , s.stop_id

注意:这将消除任何“重复”行;如果您希望返回重复项,则只需删除 GROUP BY 子句。

为了获得此查询的最佳性能,您可能希望覆盖将这些作为索引中的前导列的索引。

    ON route (route_id,agency_id,route_short_name)
    ON stopTimes (trip_id, stop_id)
    ON trips (route_id, trip_id)
于 2012-07-27T20:53:04.973 回答
1

是否有可以执行此操作的 SQL 查询?

您可以使用INSERT ... SELECT语法来实现它:

INSERT INTO routeStops (route_id, agency_id, route_short_name, stop_id)
SELECT DISTINCT r.route_id, r.agency_id, r.route_short_name, s.stop_id
  FROM routes r
  JOIN trips t ON r.route_id = t.route_id
  JOIN stopTimes s ON t.trip_id = s.trip_id;

我应该向 route_id 和 stop_id 添加索引以优化性能吗?

这些应该是他们表中的主键,以及其他表中的外键。

我应该向trip_id 添加全文索引吗?

我不推荐它,因为它太慢了。我建议你改变你的表并使用inttrip_id:

CREATE TABLE trips (
  trip_id int(10) unsigned NOT NULL,
  trip_id_old varchar(30) DEFAULT NULL,
  route_id int(11) DEFAULT NULL,
  PRIMARY KEY (trip_id)
)
于 2012-07-27T21:25:26.117 回答