2012-06-28 77 views
5

我被困在一個非常奇怪的問題。我的意思是我不會如何威脅這一點。我可以使用什麼機制來訂購數組?

基本上,我得到了一個網頁,列出了定義的公交路線的所有車站(例如,route_id = 141)。有時候,一條路線可以從A點開始,理論上從B點到另一個終點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 

etc ..它總是在A點和B點之間。從A點到B點的時間有90%,但其他10%可以在那裏點到點之間的任何點(有時是從中點到A或B)。

好的。在我使用stop_sequence對結果進行排序之前。我知道停車順序的順序,所以停車1,停車2等等,以及多少次停車(旅行是從A到B,或A到中等等)。

現在,我找到了一種方法來排序我的結果旅行和清楚他們,所以現在我知道我得到的所有旅程(A - B,B - A,中間,中間B等)。所以如果我們說我有A-B,B-A,A-Middle和B-Middle,我有4種可能的路線旅行。然後我把所有停止鏈接到它。

例如,這是一個定義路線的旅程A到B的列表。請stop_sequence注意值35

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.第二站是與上面的停止點36相同。正如你所看到的,從停止35到58的計數是24.與第二次旅行相同。

現在,我想知道的是,我可以如何使用PHP將它們合併?我想在這裏說第二組,並在匹配的第一個匹配項中將它合併到第一組中,因此第二組中的stop_sequence 1將變爲stop_sequence 35,因爲匹配並且它是相同的。

使用這種方法,我可以保持停止順序,而不是在排序結束時使用stop_sequence,因爲正如您所見,第二次行程在第一次行程中具有等於24的stop_sequence 1。這意味着如果我通過使用MySQL的stop_sequence命令,它將按順序順序排列所有stop_sequence,所以resulst將從第一次旅行開始爲stop_sequence 1,從第二次旅行開始,序列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定義,如果從A-B,B-A,A-中間等的

stop_sequence是停止的用於定義的跳閘

stop_idstop_code共享相同的東西的順序 - 唯一ID(一個用於用戶和一個用於內部系統)

trip_headsign是像141-W或141-N(西部或北部)。

編輯

隨着我的查詢,我可以得到所有停止每一行(綠色和紅色在這裏)。 我想通過保持訂單將其合併到一個列表中。 example schema

路線可以是從停止1(紅色)以停止8.所以跳閘1可以是1停止,停止2等直至停止8.

路線可以是從停止1(綠色)以停止8.所以旅行可以停止1,停止7和停止8.

我的查詢給我兩個旅行停止的名單。

現在,我想將它們合併爲:

名單: - 停止1(紅色) - 停止2 - 停止3 .... - 停止6 - 停止1(綠) - 停止7(一次,即使他在旅途紅色和綠色) - 停止8(一次,即使他在旅途紅色和綠色)

+0

您的查詢爲您提供多次該航線的旅程嗎?你希望將較短的行程與較長的行程「對齊」? –

+0

@Jack此查詢將返回按行程分組的所有站點。假設我的旅行A到B,中間到B和B到A,它會在每次旅行的順序中返回到所有的停車位。如果我們用上面的例子考慮這個查詢,上面的例子返回2次旅行(A-B和B中間)。我想把B合併成一個BECAUSE B匹配它的一部分。所以最後,訂單保持不變,我沒有多個列表。只有一個列表。 –

+0

等一等,難道你不能以停站次數來保持最長的旅程嗎?這不是總是正確的嗎? –

回答

1

要總結一下已經在評論中有人說:

  1. 查找斷言的第一站權威之旅爲A,最後一站爲B
  2. 對於彼此的行程:
    1. 如果第一站是A,將左/頂對齊主要出行
    2. 如果最後一站是B,這將是右邊/底部對齊主要出行

可選,你就可以開始在較短行程的兩側,並刪除不停止任何出現在主要行程中。

+0

非常感謝您的寶貴時間。 –

+0

@DavidBélanger我的榮幸;很高興我仍然可以把我的頭圍繞這個問題結束:) –

+0

是的,這並不容易。我使用GTFS數據庫,谷歌做到了這一點,使之難以使用。 –

相關問題