我陷入了一个非常奇怪的问题。我的意思是我不怎么威胁这个。
基本上,我有一个网页,其中列出了已定义公交路线的所有站点(例如,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 到中间等)。
现在,我找到了一种按行程对结果进行排序并将它们区分开来的方法,所以现在我知道了我得到的所有行程(AB、BA、A-middle、middle-B 等)。
因此,如果假设我有 AB、BA、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,等等,我的所有停靠点的顺序都是错误的,显然是错误的。
我想在 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(一个用于用户,一个用于内部系统)
trip_headsign
就像 141-W 或 141-N(至于西或北)。!
编辑:
通过我的查询,我可以为每次旅行都停下来(这里是绿色和红色)。我想通过保持顺序将其合并到一个列表中。 示例架构
路线可以从第 1 站(红色)到第 8 站。所以行程 1 可以是第 1 站、第 2 站等,直到第 8 站。
路线可以从第 1 站(绿色)到第 8 站。所以行程可以是第 1 站、第 7 站和第 8 站。
我的查询给了我两个行程站的名单。
现在,我想将它们合并如下:
列表: - 1 号站(红色) - 2 号站 - 3 号站 .... - 6 号站 - 1 号站(绿色) - 7 号站(即使他处于红色和绿色行程中也一次) - 8 号站(即使他处于红色和绿色行程中)