我陷入了一个非常奇怪的问题。我的意思是我不怎么威胁这个。
基本上,我有一个网页,其中列出了定义的公交路线的所有站点(例如,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)。
确定。在我使用stop_sequence对结果进行排序之前。我知道停止序列的顺序,所以停止1,停止2等等,以及多少次停靠(从A到B,或从A到中等)。
现在,我找到了一种方法来通过旅行对我的结果进行排序并将它们分开,所以现在我知道我得到的所有行程(A-B,B-A,A-middle,中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,因为如您所见,第二次行程的第一次行程中stop_sequence 1等于24。这意味着如果我通过使用MySQL的stop_sequence命令,它将按顺序排序所有stop_sequence,因此结果将是第一次旅行的stop_sequence 1,第二次旅行的序列1等等,我的命令将是错误的所有停止将是明确的错误。< / p>
我想在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-middle等。
stop_sequence
是定义行程的停靠顺序
stop_id
和stop_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 :(得分:1)
总结评论中所说的内容:
或者,您可以从较短行程的任一侧开始,并移除主要行程中未出现的任何停靠点。