2

以下の表を使用しています。

1   0051ML66220600132482    06:00:00        06:00:00        1538    100 0   1
2   0051ML66220600132482    06:00:00        06:00:00        1540    200 0   0
3   0051ML66220600132482    06:00:00        06:00:00        1541    300 0   0
4   0051ML66220600132482    06:01:00        06:01:00        1542    400 0   0
5   0051ML66220600132482    06:01:00        06:01:00        1543    500 0   0
6   0051ML66220600132482    06:02:00        06:02:00        1544    600 0   0
7   0051ML66220600132482    06:03:00        06:03:00        1546    700 0   0

以下のようなテーブル構造:

> ------------------------------------------------------------------
> --  TABLE stop_times
> ------------------------------------------------------------------
> 
> CREATE TABLE stop_times ( id int(12),
>                           trip_id varchar(100),
>                           arrival_time varchar(8),
>                           arrival_time_seconds int(100),
>                           departure_time varchar(8),
>                           departure_time_seconds int(100),
>                           stop_id varchar(100),
>                           stop_sequence varchar(100),
>                           pickup_type varchar(2),
>                           drop_off_type varchar(2) );

DISTINCT を取得しようとしていますtrip_idが、それは目的地と到着の両方に一致しますstop_id

私は運がない以下のSQLを試しました:

select DISTINCT trip_id from stop_times where stop_id=1538 AND stop_id =1540;

どこで生成する必要があります:0051ML66220600132482

以下のような INNER JOIN SQL も試しました。

SELECT 
       t.trip_id,
       start_s.stop_name as departure_stop,
       end_s.stop_name as arrival_stop
FROM
trips t 
        INNER JOIN stop_times start_st ON t.trip_id = start_st.trip_id
        INNER JOIN stops start_s ON start_st.stop_id = start_s.stop_id
        INNER JOIN stop_times end_st ON t.trip_id = end_st.trip_id
        INNER JOIN stops end_s ON end_st.stop_id = end_s.stop_id
WHERE 
   start_s.stop_id = 1538 
  AND end_s.stop_id = 1540;

しかし、これは非常に遅く、この単純なクエリには約 8 ~ 15 秒かかります。

説明 追加:

ここに画像の説明を入力

このクエリを作成するための最速/最良の方法は何ですか?

4

2 に答える 2

3

つまり、出発地 (始点) と目的地 (終点) のペアの停留所を通過するすべてのルートを特定するクエリを探しています。

このクエリを試してください:

SELECT destination.trip_id
    FROM stop_times AS origin
    INNER JOIN stop_times AS destination
        ON destination.trip_id = origin.trip_id
        AND destination.stop_id = 1540
    WHERE origin.stop_id = 1538
        AND origin.stop_sequence < destination.stop_sequence;

または、よりきれいなビューの場合 (および質問の 2 番目のクエリと一致する場合):

SELECT destination.trip_id, origin_stop.name, destination_stop.name
    FROM stop_times AS origin
    INNER JOIN stop_times AS destination
        ON destination.trip_id = origin.trip_id
        AND destination.stop_id = 1540
    INNER JOIN stops AS origin_stop
        ON origin_stop.id = origin.stop_id
    INNER JOIN stops AS destination_stop
        ON destination_stop.id = destination.stop_id
    WHERE origin.stop_id = 1538
        AND origin.stop_sequence < destination.stop_sequence;

stop_id良好なパフォーマンスを得るには、最初にとにインデックスを作成しますtrip_id

CREATE INDEX stop_times_stop_id_trip_id_index ON stop_times(stop_id, trip_id);

(EternalHour のクエリは、最初に 1 つの停留所を通過してから別の停留所を通過する旅行だけでなく、いずれかの停留所を通過するすべての旅行を識別することに注意してください。)

于 2015-04-30T09:17:55.733 に答える
1

これが必要なクエリのようです。取り出してDISTINCTと交換しGROUP BY、 も交換しWHEREましたIN。クエリは、引用符を追加していないためではなく、 stop_idtype である必要があることを示しています。フィドルはそれを反映しています。INTvarchar

IN基本的に のOR代わりに を実行しANDます。AND両方stop_idが同じ行に存在しないため、何も返されません。

SELECT trip_id 
FROM stop_times 
WHERE stop_id IN(1538,1540)
GROUP BY trip_id

ここにSQLFiddleがあります

于 2015-04-30T08:55:52.197 に答える