私は非常に奇妙な問題で立ち往生しています。私はこれを脅かす方法はありません。
基本的に、定義されたバスルートのすべての停車地を一覧表示する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_id
AB、BA、A-middleなどからのものかどうかを定義します。
stop_sequence
定義された旅行の停車順です
stop_id
同じことをstop_code
共有します-一意のID(1つはユーザー用、もう1つは内部システム用)
trip_headsign
141-Wまたは141-N(西または北)のようなものです。
編集:
私のクエリでは、各旅行のすべての停車地を取得できます(ここでは緑と赤)。順序を維持して、これを1つのリストにマージしたいと思います。 スキーマの例
ルートは、停車地1(赤)から停車地8までです。したがって、トリップ1は停車地1、停車地2など、停車地8までです。
ルートは、停車地1(緑)から停車地8までです。したがって、旅行は停車地1、停車地7、停車地8になります。
私のクエリは私に両方のトリップストップのリストを与えます。
今、私はそれらを次のようにマージしたいと思います:
リスト:-ストップ1(赤)-ストップ2-ストップ3 ....-ストップ6-ストップ1(緑)-ストップ7(彼が赤と緑のトリップにいる場合でも1回)-ストップ8(彼が赤と緑の旅に出ています)