5

私は非常に奇妙な問題で立ち往生しています。私はこれを脅かす方法はありません。

基本的に、定義されたバスルートのすべての停車地を一覧表示するWebページを取得しました(例route_id = 141)。時々、ルートはポイントAから始まり、ポイントBに行くことができるので、理論的にはある終点から別の終点に行くことができます。しかし、いつか、同じルートがAとBの間のどこかで旅行を開始し、ポイントAまたはBに行くことができます。

あなたはこのアドレスで実際の実例を見ることができます:http ://stm.tranzit.ca/bus/stops/85/Hochelaga/

私のスーパードロー:

Regular trip
Start(A) ----------------------------------- End(B)

Sometime
                 Start --------------------- End(B)
Start(A) ---------------------- End

など。常にポイントAとBの間にあります。90%の時間はAからBですが、残りの10%は、そこから別のポイントまでの間のどこにでもあります(中間からAまたはBの場合もあります)。 。

Ok。stop_sequenceを使用して結果を並べ替える前。停止シーケンスの順序を知っているので、停止1、停止2など、およびトリップごとに停止する回数(AからB、またはAから中央など)。

これで、結果を旅行ごとに並べ替えて区別する方法を見つけたので、取得したすべての旅行(AB、BA、A-middle、middle-Bなど)がわかりました。

したがって、AB、BA、A-Middle、B-Middleを取得したとすると、ルートには4つの可能な旅行があります。次に、それにリンクされているすべてのストップをフェッチします。

たとえば、これは定義されたルートのAからBへの旅行のリストです。stop_sequence35の値に注意してください。

1   #53014  Station Frontenac (Frontenac / Ontario)

... 2, 3. etc..

34  #53293  Honoré-Beaugrand / Roux  
35  #54257  Station Honoré-Beaugrand / Sherbrooke    
36  #53290  Saint-Donat / Sherbrooke     
37  #53265  Saint-Donat / De Forbin-Janson   
38  #54676  Saint-Donat / De Grosbois    
39  #54674  Saint-Donat / Roi-René   
40  #54672  Saint-Donat / les Reaux  
41  #54668  Saint-Donat / Chénier    
42  #54661  Joseph-Renaud / Yves-Prévost     
43  #54646  Joseph-Renaud / Châtillon    
44  #54629  Joseph-Renaud / Wilfrid-Pelletier    
45  #54605  Joseph-Renaud / Châteauneuf  
46  #54609  Châteauneuf / Vaujours   
47  #54610  Châteauneuf / Rabelais   
48  #54612  Châteauneuf / de la Loire    
49  #54621  Châteauneuf / Roi-René   
50  #54623  Châteauneuf / des Ormeaux    
51  #54639  Châteauneuf / Rondeau    
52  #54724  Rondeau / Georges    
53  #54735  Rondeau / De La Vérendrye    
54  #54738  Rhéaume / Chaumont   
55  #54740  Chaumont / Guy   
56  #54741  Chaumont / Azilda    
57  #54742  Yves-Prévost / Azilda    
58  #54659  des Ormeaux / Chaumont

これがミドルとBの間の旅行です。

1   #54257  Station Honoré-Beaugrand / Sherbrooke    
2   #53290  Saint-Donat / Sherbrooke     
3   #53265  Saint-Donat / De Forbin-Janson   
4   #54676  Saint-Donat / De Grosbois    
5   #54674  Saint-Donat / Roi-René   
6   #54672  Saint-Donat / les Reaux  
7   #54668  Saint-Donat / Chénier    
8   #54661  Joseph-Renaud / Yves-Prévost     
9   #54646  Joseph-Renaud / Châtillon    
10  #54629  Joseph-Renaud / Wilfrid-Pelletier    
11  #54605  Joseph-Renaud / Châteauneuf  
12  #54609  Châteauneuf / Vaujours   
13  #54610  Châteauneuf / Rabelais   
14  #54612  Châteauneuf / de la Loire    
15  #54621  Châteauneuf / Roi-René   
16  #54623  Châteauneuf / des Ormeaux    
17  #54639  Châteauneuf / Rondeau    
18  #54724  Rondeau / Georges    
19  #54735  Rondeau / De La Vérendrye    
20  #54738  Rhéaume / Chaumont   
21  #54740  Chaumont / Guy   
22  #54741  Chaumont / Azilda    
23  #54742  Yves-Prévost / Azilda    
24  #54659  des Ormeaux / Chaumont

ご覧のとおり、ここでのstop_sequence 1は35と同じです。2番目の停止は、上記の停止36と同じです。ご覧のとおり、ストップ35から58までのカウントは24です。2回目のトリップと同じです。

さて、私が知りたいのは、PHPを使用してそれらをマージする方法です。ここで2番目のグループを取り上げて、一致する最初のオカレンスで最初のグループ内にマージします。したがって、2番目のグループのstop_sequence 1は、一致して同じであるため、stop_sequence35になります。

この方法を使用すると、注文の最後にstop_sequenceを使用するのではなく、停止順序を維持できます。これは、ご覧のとおり、2番目のトリップのstop_sequence1が最初のトリップで24に等しいためです。つまり、MySQLを使用してstop_sequenceで注文すると、すべてのstop_sequenceが順番に並べ替えられるため、結果は最初のトリップからのstop_sequence 1、2番目のトリップからのシーケンス1などになり、すべてのストップの順序が間違ってしまいます。

PHPでこれを実行したいのですが、結果を配列で照合し、後でXの結果を回避して、完全に照合できるようにする方法がわかりません。

私のSQLクエリが何であるかを知りたい場合は、ここにあります:

SELECT      t.trip_id, t.trip_headsign, st.stop_sequence, s.stop_id, s.stop_code, s.stop_name
FROM        trips AS t
LEFT JOIN   stop_times AS st ON st.trip_id = t.trip_id
LEFT JOIN   stops AS s ON s.stop_id = st.stop_id
WHERE       t.route_id = 141
    AND     t.trip_id IN (
        SELECT trip_id
        FROM (
            SELECT trip_id
            FROM (
                SELECT      COUNT(*) AS count, trips.trip_id, trips.trip_headsign
                FROM        trips
                LEFT JOIN   stop_times ON trips.trip_id = stop_times.trip_id
                WHERE       route_id = 141
                    AND     trips.trip_id LIKE (SELECT CONCAT(service_id, "%") FROM calendar_dates WHERE date = "20120628")
                GROUP BY    trips.trip_id
            ) a
            GROUP BY count, trip_headsign
        ) a
    )
GROUP BY    t.trip_id, st.stop_id
ORDER BY    t.trip_id ASC, st.stop_sequence ASC

trip_idAB、BA、A-middleなどからのものかどうかを定義します。

stop_sequence定義された旅行の停車順です

stop_id同じことをstop_code共有します-一意のID(1つはユーザー用、もう1つは内部システム用)

trip_headsign141-Wまたは141-N(西または北)のようなものです。

編集

私のクエリでは、各旅行のすべての停車地を取得できます(ここでは緑と赤)。順序を維持して、これを1つのリストにマージしたいと思います。 スキーマの例

ルートは、停車地1(赤)から停車地8までです。したがって、トリップ1は停車地1、停車地2など、停車地8までです。

ルートは、停車地1(緑)から停車地8までです。したがって、旅行は停車地1、停車地7、停車地8になります。

私のクエリは私に両方のトリップストップのリストを与えます。

今、私はそれらを次のようにマージしたいと思います:

リスト:-ストップ1(赤)-ストップ2-ストップ3 ....-ストップ6-ストップ1(緑)-ストップ7(彼が赤と緑のトリップにいる場合でも1回)-ストップ8(彼が赤と緑の旅に出ています)

4

1 に答える 1

1

コメントで言われたことを要約すると:

  1. 最初の停車地がAで、最後の停車地がBであると主張して、権威ある旅行を見つけます
  2. お互いの旅行のために:
    1. 最初の停車地がAの場合、メイントリップに合わせて左/上に配置されます
    2. 最後の停車地がBの場合、メイントリップに合わせて右/下に配置されます

オプションで、短いトリップのいずれかの側から開始して、メインのトリップに表示されないストップを削除できます。

于 2012-06-28T15:40:12.280 に答える