1

私はMySqlとsqlを初めて使用します。次の方法がわかりません。

私は4つの関連するテーブルを持つバススケジュールデータベースを持っています:

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)

関係

  • 旅行へのルート: 1対多
  • stopTimesへの旅行: 1対多
  • stopTimesに停止: 1対1

これらのテーブルから、次のフィールドを持つ新しいテーブル「routeStops」を作成したいと思います。

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

それとストップの間には1対多の関係があります。

それを実行できるSQLクエリはありますか?

パフォーマンスを最適化するために、 route_idstop_idにインデックスを追加する必要がありますか?trip_idにフルテキストインデックスを追加する必要がありますか?

私はそれに不慣れであり、いくつかの洞察に感謝します。

私はPHPMyAdminとかなり新しいXAMPPインストールを使用しています。

tnx、

4

2 に答える 2

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)
)
于 2012-07-27T21:25:26.117 に答える
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 に答える