sql语法,用于从多个大表中创建新表

时间:2012-07-27 20:04:19

标签: mysql sql phpmyadmin

我是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_id stop_id 中添加索引以优化效果吗?我应该为trip_id添加全文索引吗?

我是新手,并会欣赏一些见解。

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

TNX,

2 个答案:

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

答案 1 :(得分: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添加全文索引吗?

我不推荐它,因为它太慢了。我建议您更改表格并使用int作为trip_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)
)