Làm thế nào để tạm thời lưu kết quả của truy vấn, để sử dụng trong một truy vấn khác?


12

Tôi có vấn đề này tôi nghĩ bạn có thể giúp tôi với.
PS Tôi không chắc chắn cách gọi này, vì vậy nếu bất cứ ai tìm thấy một tiêu đề phù hợp hơn, xin vui lòng chỉnh sửa.

Lý lịch

  • Tôi đang làm ứng dụng này để tìm kiếm các tuyến xe buýt.
  • Các tuyến xe buýt là một số có 3 chữ số, và là duy nhất và sẽ không bao giờ thay đổi.
  • Yêu cầu là có thể tìm kiếm các dòng từ điểm dừng A đến điểm dừng B.
  • Giao diện người dùng đã thành công trong việc gợi ý người dùng chỉ sử dụng tên dừng hợp lệ.
  • Yêu cầu là có thể hiển thị nếu một tuyến có một đường trực tiếp và nếu không, hãy hiển thị kết hợp 2 dòng và thậm chí 3 dòng.

Thí dụ:

Tôi cần đi từ điểm A đến điểm D. Chương trình sẽ hiển thị:

  • Nếu có một đường dây AD trực tiếp.
  • Nếu không, hiển thị thay thế, combo 2 dòng, chẳng hạn như AC, CD.
  • Nếu không có bất kỳ combo 2 dòng nào, hãy tìm kiếm các combo 3 dòng: AB, BC, CD.

Tất nhiên, ứng dụng sẽ hiển thị số dòng xe buýt, cũng như khi nào cần chuyển đổi xe buýt.

Tôi có gì:

Cơ sở dữ liệu của tôi được cấu trúc như sau (đơn giản hóa, cơ sở dữ liệu thực tế bao gồm các vị trí và thời gian và không có gì):

+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+

+-------------------------------+
|    lines_stops_relationship   |
+-------------+---------+-------+
|  bus_line   | stop_id | order |
+-------------+---------+-------+

Nơi lines_stops_relationshipmô tả mối quan hệ nhiều-nhiều giữa các tuyến xe buýt và các điểm dừng.

Thứ tự, biểu thị thứ tự dừng xuất hiện trong một dòng duy nhất. Không phải tất cả các dòng đi qua lại và thứ tự có ý nghĩa (điểm A với thứ tự 2 đến sau điểm B với thứ tự 1).

Vấn đề

  • Chúng tôi tìm hiểu xem một dòng có thể đi qua tuyến đường đủ dễ dàng. Chỉ cần tìm kiếm một dòng duy nhất đi qua cả hai điểm theo đúng thứ tự.
  • Làm thế nào tôi có thể tìm thấy nếu có một kết hợp 2/3 dòng? Tôi đã suy nghĩ để tìm kiếm một dòng phù hợp với điểm dừng nguồn, và một điểm dừng dừng, và xem liệu tôi có thể có một điểm dừng chung giữa chúng không, nơi người dùng có thể chuyển đổi xe buýt. Làm thế nào để tôi nhớ rằng dừng lại?
  • Combo 3 dòng thậm chí còn phức tạp hơn, tôi tìm một dòng cho nguồn, và một dòng cho đích, và sau đó thì sao? Tìm kiếm một dòng có 2 điểm dừng tôi đoán, nhưng một lần nữa, Làm thế nào để tôi nhớ các điểm dừng?

tl; dr

Làm cách nào để nhớ kết quả từ truy vấn để có thể sử dụng lại? Tôi hy vọng sẽ đạt được điều này trong một truy vấn duy nhất (đối với mỗi truy vấn cho các tuyến 1 dòng, truy vấn cho 2 và truy vấn cho các kết hợp 3 dòng).

Lưu ý: Tôi không phiền nếu ai đó đề xuất một cách tiếp cận hoàn toàn khác với những gì tôi có, tôi sẵn sàng cho bất kỳ giải pháp nào.

Sẽ trao tặng bất kỳ sự trợ giúp nào với cookie và upvote. Cảm ơn trước!



@eggyal: Tôi không có khoảng cách qua các nút. Ngoài ra, tôi bị hạn chế trong việc di chuyển bên trong mạng (tức là chỉ một số tuyến xe buýt nhất định di chuyển từ điểm A đến điểm B). Nó vẫn hữu ích cho tôi?
Madara's Ghost

Tôi cũng sẽ đề nghị sử dụng một thủ tục được lưu trữ trên một truy vấn duy nhất cho điều này - nếu thậm chí có thể thực hiện nó với một truy vấn duy nhất. Ở đó bạn có thể dễ dàng lưu trữ kết quả / biến và tái sử dụng chúng.

1
@Truth Đây có thể là tốt nhất để cung cấp cho bạn một số tuts: mysqltutorial.org/stored-procedures-loop.aspx (vòng), mysqltutorial.org/... (trường hợp) - cùng với một cái gì đó giống như thuật toán Dijkstra, bạn sẽ có thể giải quyết của bạn vấn đề. Về cơ bản, nó giống như một hàm php - nhưng trên mysql

1
Có vẻ như đã có trên Stack Overflow - liên kết này có nhiều giải pháp mặc dù không có giải pháp nào trong MySQL tại thời điểm này. (Có một số câu trả lời không dễ dàng tóm tắt và thối liên kết có lẽ không phải là vấn đề vì nếu trang web đó biến mất thì câu hỏi này cũng có thể xảy ra. Thêm vào đó, nó có rất nhiều upvote).
psr

Câu trả lời:


3

Bạn có thể không muốn thực hiện quyết định thay đổi này vào thời điểm này, nhưng những gì bạn mô tả chính xác là trường hợp sử dụng cho Cơ sở dữ liệu đồ thị . Cơ sở dữ liệu đồ thị dựa trên lý thuyết đồ thị, đó là những gì bạn đang chạm vào bằng cách cố gắng tìm một đường dẫn giữa 'X' và 'Y' trên một biểu đồ có hướng của các tuyến xe buýt.

Nếu bạn chưa nhìn vào một cái, hãy xem qua một cái gì đó như Neo4J . Nó có API REST và bạn có thể tìm thấy các máy khách PHP cho nó.

Bạn sẽ tìm thấy một nhóm người của Stack Overflow , người có thể giúp đỡ trong việc thực hiện mọi thứ.


1
Tôi hiện đang ở giai đoạn suy nghĩ, tôi có thể thay đổi bất cứ điều gì. Tôi sẽ kiểm tra các liên kết của bạn. Ngoài ra, câu hỏi này đến từ Stack Overflow , tôi biết họ có thể giúp tôi thực hiện nó :)
Ghost của Madara

1
Tôi sẽ đề xuất các truy vấn đệ quy, nhưng có vẻ như MySQL không hỗ trợ các truy vấn đó nên câu trả lời này có thể tốt hơn.
Thất vọngWithFormsDesigner

@FrustratedWithFormsDesigner Có thể có một giải pháp MySQL rất khó xử sẽ kết hợp SP và danh sách kề, nhưng tôi không nghĩ rằng nó thậm chí đáng để dành thời gian nghĩ về nó.
yannis

@YannisRizos: Nó có thể là một thử thách golf mã tốt, có thể? ;)
Thất vọngWithFormsDesigner

1
@FrustratedWithFormsDesigner Nah, đây là một thử thách golf mã tốt
yannis

0

Hãy nói rằng người dùng muốn đi từ $start_idđến $end_id(cả hai đều là những giá trị stop_id hợp lệ). Bạn có thể sử dụng các truy vấn này để tìm một tuyến hợp lệ từ $start_idđến $end_id:

  1. Tìm kiếm tuyến đường trực tiếp (đường đơn):

    SELECT *
    FROM bus_stops bs1, bus_stops bs2
    WHERE bs1.stop_id=$start_id AND bs2.stop_id=$end_id AND bs1.bus_line=bs2.bus_line
  2. Nếu không có kết quả với truy vấn trước đó, thì hãy tìm kiếm tuyến đường bằng 2 lignes:

    SELECT *
    FROM bus_stops bs1, bus_stops bs2, bus_stops bs3, bus_stops bs4
    WHERE bs1.stop_id=$start_id
        AND bs1.bus_line=bs2.bus_line
    AND bs2.stop_id=bs3.stop_id
        AND bs3.bus_line=bs4.bus_line
    AND bs4.stop_id=$end_id

Thay thế *bằng các lĩnh vực bạn thực sự cần phải lấy.


Xin chào Jocelyn và chào mừng! Vui lòng đọc kỹ trang trợ giúp chỉnh sửa của chúng tôi để tìm hiểu cách bạn có thể tận dụng tối đa Markdown. Tôi đã chỉnh sửa câu trả lời của bạn lần này, bạn có thể kiểm tra lịch sử sửa đổi của nó để xem những chỉnh sửa tôi đã thực hiện.
yannis

Tại sao bạn chọn từ cùng một cơ sở dữ liệu 4 lần liên tiếp?
Madara's Ghost

Và điều gì xảy ra nếu bạn cần thêm một tuyến xe buýt ( bus_stops bs5) để hoàn thành tuyến đường?
Thất vọngWithFormsDesigner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.