2012-07-27 26 views
1

我是MySql和sql的新手。 我無法弄清楚如何做到以下幾點:用於從多個大表中創建新表的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) 

關係

  • 路線行程:一對多
  • 前往stopTimes:一對多
  • 站到stopTimes:一對一

這些表我想創建一個新表「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,

+0

如何已經stop_id列的表假設有一個與許多停關係? – Vatev 2012-07-27 20:26:09

+0

你是對的 - 一對一 – Guy 2012-07-28 15:44:28

回答

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) 
) 
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)