我是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,
答案 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)
)