Jak tymczasowo zapisać wynik zapytania, aby użyć go w innym?

12

Mam ten problem, myślę, że możesz mi pomóc.
PS Nie jestem pewien, jak to nazwać, więc jeśli ktoś znajdzie bardziej odpowiedni tytuł, zrób edycję.

tło

  • Tworzę tę aplikację do wyszukiwania linii tranzytowych autobusów.
  • Linie autobusowe są trzycyfrowe i są unikalne i nigdy się nie zmienią.
  • Wymagana jest możliwość wyszukiwania linii od przystanku A do przystanku B.
  • Interfejs użytkownika już skutecznie radzi użytkownikowi, aby używał tylko prawidłowych nazw zatrzymania.
  • Wymagane jest, aby móc wyświetlać, jeśli trasa ma linię bezpośrednią, a jeśli nie, wyświetlać kombinację 2-liniową, a nawet 3-liniową.

Przykład:

Muszę przejść z punktu A do punktu D. Program powinien pokazywać:

  • Jeśli istnieje bezpośrednia linia AD.
  • Jeśli nie, wyświetl alternatywne 2-liniowe kombinacje, takie jak AC, CD.
  • Jeśli nie ma żadnych 2-liniowych kombinacji, wyszukaj 3-liniowe kombinacje: AB, BC, CD.

Oczywiście aplikacja powinna wyświetlać numery linii autobusowych, a także kiedy je zamieniać.

Co ja mam:

Moja baza danych ma następującą strukturę (uproszczona, rzeczywista baza danych zawiera lokalizacje i godziny i tak dalej):

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

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

Gdzie lines_stops_relationshipopisać relację wiele do wielu między liniami autobusowymi a przystankami.

Porządek, oznacza kolejność, w której stop pojawia się w jednym wierszu. Nie wszystkie linie przechodzą w tę iz powrotem, a porządek ma znaczenie (punkt A z rzędem 2 występuje po punkcie B z rzędem 1).

Problem

  • Dowiadujemy się, czy linia może łatwo przejść przez trasę. Wystarczy wyszukać pojedynczą linię, która przechodzi przez oba punkty we właściwej kolejności.
  • Jak mogę sprawdzić, czy istnieje kombinacja linii 2/3? Myślałem o poszukiwaniu linii pasującej do przystanku źródłowego i jednej do przystanku docelowego, i sprawdzę, czy uda mi się uzyskać wspólny przystanek między nimi, w którym użytkownik może przełączać autobusy. Jak mam zapamiętać ten przystanek?
  • Kombinacja 3 linii jest jeszcze trudniejsza, znajduję linię dla źródła i linię dla miejsca docelowego, a potem co? Wyszukaj linię, która ma chyba 2 przystanki, ale jeszcze raz: Jak mogę zapamiętać przystanki?

tl; dr

Jak zapamiętać wyniki zapytania, aby móc go ponownie użyć? Mam nadzieję, że uda mi się to osiągnąć za pomocą pojedynczego zapytania (dla każdego zapytania dla tras 1-liniowych, zapytania dla 2 linii i zapytania dla kombinacji 3-liniowych).

Uwaga: nie mam nic przeciwko, jeśli ktoś zaproponuje zupełnie inne podejście niż to, co mam, jestem otwarty na wszelkie rozwiązania.

Udzielą wszelkiej pomocy za pomocą pliku cookie i opinii. Z góry dziękuję!

Duch Madary
źródło
@eggyal: Nie mam odległości między węzłami. Ponadto mam ograniczony ruch wewnątrz sieci (tzn. Tylko niektóre linie autobusowe przemieszczają się z punktu A do punktu B). Czy nadal jest dla mnie przydatny?
Duch Madary
Sugerowałbym również użycie do tego procedury składowanej zamiast pojedynczego zapytania - jeśli jest to nawet możliwe za pomocą pojedynczego zapytania. Tam możesz łatwo przechowywać wyniki / zmienne i ponownie je wykorzystywać.
1
@Truth Prawdopodobnie najlepiej jest podać kilka porad : mysqltutorial.org/stored-procedures-loop.aspx (pętle), mysqltutorial.org/… (przypadki) - w połączeniu z czymś takim jak algorytm dijkstra, powinieneś być w stanie rozwiązać swój problem. Zasadniczo jest to jak funkcja php - ale na mysql
1
Wygląda na to, że już działa na przepełnieniu stosu - ten link ma wiele rozwiązań, choć żadne z nich nie jest obecnie w MySQL. (Istnieje kilka odpowiedzi, które nie dają się łatwo streścić, a zgnilizna linków prawdopodobnie nie stanowi problemu, ponieważ jeśli ta strona zniknie, ta prawdopodobnie również. A do tego ma wiele pozytywnych opinii).
psr

Odpowiedzi:

3

W tym momencie możesz nie chcieć wprowadzić drastycznej zmiany, ale opisujesz dokładnie przypadek użycia dla baz danych Graph . Graficzne bazy danych opierają się na teorii grafów, na którą się poruszasz, próbując znaleźć ścieżkę między „X” i „Y” na ukierunkowanym wykresie tras autobusów.

Jeśli jeszcze tego nie zrobiłeś, rzuć okiem na coś takiego jak Neo4J . Ma interfejs API REST i można dla niego znaleźć klientów PHP .

Znajdziesz grupę ludzi z przepełnieniem stosu, którzy mogą pomóc w implementacji rzeczy.

Dan McGrath
źródło
1
Jestem obecnie w fazie myślenia, mogę zmienić wszystko. Sprawdzę twoje linki. To pytanie pochodzi również od przepełnienia stosu. Wiem, że mogą mi pomóc w jego wdrożeniu :)
Ghost Madara
1
Chciałem zasugerować zapytania rekurencyjne, ale wygląda na to, że MySQL ich nie obsługuje, więc ta odpowiedź może być lepsza.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Może istnieć bardzo niewygodne rozwiązanie MySQL, które łączyłoby SP i listę sąsiadów, ale nie sądzę, że warto o tym myśleć.
yannis
@YannisRizos: Może to może być dobre wyzwanie w golfa? ;)
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner Nie, to jest dobre wyzwanie w golfa z kodem
yannis
0

Załóżmy, że użytkownik chce przejść od $start_iddo $end_id(oba są prawidłowe wartości stop_id). Możesz użyć tych zapytań, aby znaleźć prawidłową trasę $start_iddo $end_id:

  1. Wyszukaj bezpośrednią trasę (pojedyncza linia):

    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. Jeśli nie ma wyniku z poprzednim zapytaniem, wyszukaj trasę za pomocą 2 lign:

    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
    

Zastąp *pola, które naprawdę potrzebujesz pobrać.

Jocelyn
źródło
Cześć Jocelyn i witaj! Przeczytaj dokładnie naszą stronę pomocy dotyczącą edycji, aby dowiedzieć się, jak uzyskać jak najwięcej z Markdown. Tym razem zredagowałem twoją odpowiedź, możesz sprawdzić jej historię zmian, aby zobaczyć, jakie zmiany wprowadziłem.
yannis
Dlaczego wybierasz z tej samej bazy danych 4 razy z rzędu?
Duch Madary
A co się stanie, jeśli potrzebujesz jeszcze jednej linii autobusowej ( bus_stops bs5), aby ukończyć trasę?
FrustratedWithFormsDesigner