2012-06-28 20 views
5

Tôi bị kẹt ở một vấn đề rất lạ. Tôi có nghĩa là tôi không làm thế nào để đe dọa điều này.Tôi có thể sử dụng thợ cơ khí nào để đặt hàng một mảng?

Về cơ bản, tôi nhận được trang web nơi tôi liệt kê tất cả các điểm dừng cho tuyến đường xe buýt đã xác định (ví dụ: route_id = 141). Đôi khi, một con đường, có thể bắt đầu từ điểm A và đi đến điểm B về mặt lý thuyết từ một đầu cuối đến một trạm cuối khác. NHƯNG, đôi khi, cùng một tuyến đường có thể bắt đầu chuyến đi của mình ở đâu đó giữa A và B và đi vào thời điểm A hoặc B.

Bạn có thể thấy một ví dụ làm việc trực tiếp tại địa chỉ này: http://stm.tranzit.ca/bus/stops/85/Hochelaga/

siêu bốc thăm của tôi:

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

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

vv .. Luôn luôn ở giữa điểm A và B. 90% thời gian từ A đến B nhưng 10% khác có thể ở bất kỳ vị trí nào giữa đó cho đến một điểm khác giữa đó (đôi khi là từ giữa đến A hoặc B).

Ok. Trước khi tôi phân loại kết quả của tôi bằng cách sử dụng stop_sequence. Tôi biết thứ tự của chuỗi dừng, vì vậy dừng lại 1, dừng 2, vv và bao nhiêu dừng lại bởi chuyến đi (một chuyến đi là từ A đến B, hoặc A đến giữa, vv).

Bây giờ, tôi đã tìm cách sắp xếp kết quả theo chuyến đi và phân biệt chúng vì vậy bây giờ tôi biết tất cả chuyến đi tôi nhận được (A-B, B-A, A-trung, B giữa, vv ..).

Vì vậy, nếu giả sử tôi nhận được A-B, B-A, A-Trung và B-Trung, tôi có 4 chuyến đi cho một tuyến đường. Sau đó tôi lấy tất cả các điểm dừng được liên kết với nó.

Ví dụ, đây là danh sách cho chuyến đi từ A đến B cho tuyến đường đã xác định. Xin lưu ý giá trị tại 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 

Dưới đây là một chuyến đi giữa giữa và 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 

Bây giờ, như bạn có thể thấy, stop_sequence 1 ở đây là giống như 35. dừng thứ hai là giống như điểm dừng 36 ở trên. Như bạn có thể thấy, số đếm từ điểm dừng 35 đến 58 là 24. Tương tự như chuyến đi thứ hai.

Bây giờ, những gì tôi muốn biết, là làm thế nào tôi có thể hợp nhất chúng bằng cách sử dụng PHP? Tôi muốn giả sử nhóm thứ hai ở đây và hợp nhất nó bên trong cái đầu tiên ở lần xuất hiện đầu tiên khớp với nhau, vì vậy stop_sequence 1 từ nhóm thứ hai sẽ trở thành stop_sequence 35 vì nó khớp và nó giống nhau.

Sử dụng cách này, tôi có thể giữ lệnh dừng, không phải bằng cách sử dụng stop_sequence ở cuối quá trình đặt hàng, vì như bạn đã thấy, chuyến đi thứ hai có stop_sequence 1 bằng 24 trên chuyến đầu tiên. Điều đó có nghĩa là nếu tôi đặt lệnh bằng stop_sequence bằng MySQL, nó sẽ sắp xếp tuần tự tất cả stop_sequence để resulst sẽ stop_sequence 1 từ chuyến đi đầu tiên, chuỗi 1 từ chuyến thứ hai, v.v. và thứ tự của tôi sẽ sai về tất cả các điểm dừng sẽ bị xóa.

Tôi muốn làm điều này bằng PHP nhưng tôi không biết cách kết hợp kết quả trong một mảng và tránh kết quả X sau đó để tôi có thể khớp hoàn hảo.

Nếu bạn muốn biết truy vấn SQL của tôi là gì, ở đây là:

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 xác định nếu nó là từ A-B, B-A, A-giữa, vv

stop_sequence là thứ tự của điểm dừng chân cho một chuyến đi định nghĩa

stop_idstop_code chia sẻ điều tương tự - id duy nhất (một cho người dùng và một cho hệ thống nội bộ)

trip_headsign cũng giống như 141-W hoặc 141-N (về phía tây hoặc bắc).!

EDIT:

Với truy vấn của tôi, tôi có thể nhận được tất cả dừng lại cho mỗi chuyến đi (màu xanh lá cây và màu đỏ ở đây). Tôi muốn hợp nhất điều này trong một danh sách bằng cách giữ lệnh. example schema

Route có thể từ dừng 1 (màu đỏ) để ngăn chặn 8. Vì vậy, chuyến đi 1 có thể được ngăn chặn 1, dừng 2, vv cho đến khi dừng 8.

Route có thể từ dừng 1 (màu xanh) để ngăn chặn 8. Vì vậy, chuyến đi có thể dừng lại 1, dừng 7 và dừng lại 8.

Truy vấn của tôi cung cấp cho tôi cả hai danh sách dừng của chuyến đi.

Bây giờ, tôi muốn kết hợp chúng như sau:

liệt kê: - Stop 1 (màu đỏ) - Stop 2 - Dừng 3 .... - Dừng 6 - Stop 1 (màu xanh lá cây) - Dừng 7 (một lần ngay cả khi ông đang ở trong chuyến đi màu đỏ và màu xanh lá cây) - Dừng 8 (một lần ngay cả khi ông đang ở trong chuyến đi màu đỏ và màu xanh lá cây)

+0

Truy vấn của bạn cung cấp cho bạn nhiều chuyến đi cho tuyến đường đó ngay? Và bạn muốn "sắp xếp" các chuyến đi ngắn hơn với những chuyến đi dài hơn? –

+0

@Jack Truy vấn này sẽ trả về tất cả các nhóm được dừng theo chuyến đi. Vì vậy, chúng ta hãy nói rằng tôi có chuyến đi từ A đến B, giữa B và B đến A, nó sẽ quay trở lại tất cả dừng lại theo trình tự tốt cho mỗi chuyến đi. Nếu chúng ta xem xét truy vấn này với ví dụ trên, ví dụ trên trả lại 2 chuyến đi (A-B và từ trung bình đến B). Tôi muốn hợp nhất B thành A BECAUSE B phù hợp với một phần của nó. Vì vậy, cuối cùng, thứ tự được giữ lại và tôi không có nhiều danh sách. Chỉ một danh sách. –

+0

Đợi đã, bạn có thể giữ chuyến đi dài nhất về số điểm dừng không? Điều đó không phải lúc nào cũng đúng? –

Trả lời

1

Để tóm tắt những gì đã được nói trong các ý kiến:

  1. Tìm các chuyến du lịch có thẩm quyền bằng cách khẳng định điểm dừng chân đầu tiên là A và điểm dừng chân cuối cùng là B
  2. Đối với mỗi chuyến đi khác:
    1. nếu dừng chân đầu tiên là A, nó sẽ được trái/trên cùng liên kết để chuyến đi chính
    2. nếu dừng chân cuối cùng là B, nó sẽ phải/dưới liên kết đến chuyến đi chính

Tùy chọn, bạn có thể bắt đầu ở hai bên của chuyến đi ngắn hơn và loại bỏ bất kỳ điểm dừng mà không làm xuất hiện trong chuyến đi chính.

+0

Cảm ơn rất nhiều vì đã dành thời gian quý giá của bạn. –

+0

@ DavidBélanger niềm vui của tôi; vui mừng tôi vẫn có thể quấn đầu của tôi xung quanh vấn đề cuối cùng :) –

+0

Vâng, nó không phải là dễ dàng. Tôi sử dụng cơ sở dữ liệu GTFS và Google đã làm điều này để làm cho việc này trở nên khó khăn. –

Các vấn đề liên quan