Wie speichere ich das Ergebnis der Abfrage vorübergehend, um es in einem anderen zu verwenden?

12

Ich habe dieses Problem, ich denke, Sie können mir dabei helfen.
PS: Ich bin mir nicht sicher, wie ich das nennen soll. Wenn also jemand einen passenderen Titel findet, bearbeite ihn bitte.

Hintergrund

  • Ich mache diese Anwendung für die Suche nach Buslinien.
  • Buslinien haben eine dreistellige Nummer und sind eindeutig und werden sich nie ändern.
  • Die Anforderung besteht darin, in der Lage zu sein, nach Zeilen von Haltestelle A bis Haltestelle B zu suchen.
  • Die Benutzeroberfläche weist den Benutzer bereits erfolgreich darauf hin, nur gültige Stoppnamen zu verwenden.
  • Voraussetzung ist, dass angezeigt werden kann, ob eine Route eine direkte Linie hat. Andernfalls wird eine Kombination aus zwei und sogar drei Linien angezeigt.

Beispiel:

Ich muss von Punkt A nach Punkt D kommen. Das Programm sollte zeigen:

  • Wenn es eine direkte Linie AD gibt.
  • Wenn nicht, zeigen Sie alternative zweizeilige Combos an, z. B. AC, CD.
  • Wenn keine 2-zeiligen Combos vorhanden sind, suchen Sie nach 3-zeiligen Combos: AB, BC, CD.

Natürlich sollte die App Busleitungsnummern sowie den Zeitpunkt des Buswechsels anzeigen.

Was ich habe:

Meine Datenbank ist wie folgt aufgebaut (vereinfachte, aktuelle Datenbank enthält Orte und Zeiten und so weiter):

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

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

Wo lines_stops_relationshipbeschreiben Sie eine Viele-zu-Viele-Beziehung zwischen den Buslinien und den Haltestellen.

Reihenfolge, bezeichnet die Reihenfolge, in der Stopps in einer einzelnen Zeile angezeigt werden. Nicht alle Zeilen gehen vor und zurück, und die Reihenfolge hat Bedeutung (Punkt A mit der Reihenfolge 2 kommt nach Punkt B mit der Reihenfolge 1).

Das Problem

  • Wir finden heraus, ob eine Linie die Route leicht genug passieren kann. Suchen Sie einfach nach einer einzelnen Linie, die beide Punkte in der richtigen Reihenfolge durchläuft.
  • Wie kann ich feststellen, ob es eine 2/3 Zeilen-Kombination gibt? Ich überlegte, nach einer Linie zu suchen, die mit der Ausgangshaltestelle und der Zielhaltestelle übereinstimmt, und zu prüfen, ob zwischen ihnen eine gemeinsame Haltestelle besteht, auf der der Benutzer den Bus wechseln kann. Wie kann ich mich an diesen Stopp erinnern?
  • Die 3-Zeilen-Kombination ist noch kniffliger. Ich finde eine Zeile für die Quelle und eine Zeile für das Ziel. Und was dann? Suchen Sie nach einer Linie mit 2 Haltestellen, aber wie kann ich mich an die Haltestellen erinnern?

tl; dr

Wie erinnere ich mich an die Ergebnisse einer Abfrage, um sie wieder verwenden zu können? Ich hoffe, dies in einer einzigen Abfrage zu erreichen (jeweils eine Abfrage für 1-Zeilen-Routen, eine Abfrage für 2 und eine Abfrage für 3-Zeilen-Combos).

Hinweis: Es macht mir nichts aus, wenn jemand einen völlig anderen Ansatz vorschlägt als den, den ich habe. Ich bin offen für Lösungen.

Unterstützt Sie mit einem Cookie und einer positiven Bewertung. Danke im Voraus!

Madaras Geist
quelle
@eggyal: Ich habe keine Abstände über den Knoten. Außerdem bin ich in der Bewegung innerhalb des Netzwerks eingeschränkt (dh nur bestimmte Buslinien bewegen sich von Punkt A nach Punkt B). Ist es immer noch nützlich für mich?
Madara's Ghost
Ich würde auch vorschlagen, eine gespeicherte Prozedur für eine einzelne Abfrage zu verwenden - falls dies überhaupt mit einer einzelnen Abfrage möglich ist. Dort können Sie Ergebnisse / Variablen einfach speichern und wiederverwenden.
1
@Truth Es ist wahrscheinlich am besten, wenn Sie ein paar Tuts angeben: mysqltutorial.org/stored-procedures-loop.aspx (Schleifen), mysqltutorial.org/… (Fälle) - in Kombination mit so etwas wie dem dijkstra-Algorithmus sollten Sie in der Lage sein, Ihr Problem zu lösen Problem. Im Grunde ist es wie eine PHP-Funktion - aber auf MySQL
1
Scheint schon auf Stack Overflow zu sein - dieser Link hat mehrere Lösungen, obwohl sich derzeit keine in MySQL befindet. (Es gibt mehrere Antworten, die sich nicht leicht zusammenfassen lassen, und Link Rot ist wahrscheinlich kein Problem, da diese Seite wahrscheinlich auch verschwindet. Außerdem hat sie viele positive Stimmen.)
PSR

Antworten:

3

Möglicherweise möchten Sie an dieser Stelle keine drastischen Änderungen vornehmen, aber was Sie beschreiben, ist genau der Anwendungsfall für Graph-Datenbanken . Graphendatenbanken basieren auf der Graphentheorie, die Sie berühren, indem Sie versuchen, einen Pfad zwischen 'X' und 'Y' über einen gerichteten Graphen von Busrouten zu finden.

Wenn Sie sich noch keinen angeschaut haben, werfen Sie einen Blick auf etwas wie Neo4J . Es hat eine REST-API und Sie können PHP-Clients dafür finden.

Sie finden eine Menge Leute von Stack Overflow finden , die bei der Implementierung helfen könnten.

Dan McGrath
quelle
1
Ich bin gerade in der Denkphase, ich kann alles ändern. Ich werde Ihre Links überprüfen. Auch diese Frage kam von Stack Overflow , ich weiß, sie können mir helfen, es zu implementieren :)
Madara's Ghost
1
Ich wollte rekursive Abfragen vorschlagen, aber anscheinend unterstützt MySQL diese nicht, daher ist diese Antwort möglicherweise besser.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Es könnte eine sehr umständliche MySQL-Lösung geben, die SP und eine Adjazenzliste kombiniert, aber ich denke nicht, dass es die Zeit wert ist, darüber nachzudenken.
Yannis
@YannisRizos: Vielleicht ist es eine gute Code-Golf-Herausforderung? ;)
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner Nein, dies ist eine gute Code-Golf-Herausforderung
Yannis
0

Sagen wir , ein Benutzer gehen will von $start_idzu$end_idAngenommen wechseln (beide sind gültige Werte für stop_id). Sie können diese Abfragen verwenden, um eine gültige Route von $start_idnach zu finden $end_id:

  1. Suche nach direkter Route (einzelne Linie):

    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. Wenn die vorherige Abfrage kein Ergebnis liefert, suchen Sie eine Route mit 2 Linien:

    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

Ersetzen Sie diese *durch die Felder, die Sie wirklich abrufen müssen.

Jocelyn
quelle
Hallo Jocelyn und herzlich willkommen! Bitte lesen Sie unsere Bearbeitungshilfe sorgfältig durch, um herauszufinden, wie Sie Markdown optimal nutzen können. Ich habe Ihre Antwort dieses Mal bearbeitet. Sie können den Änderungsverlauf überprüfen, um zu sehen, welche Änderungen ich vorgenommen habe.
Yannis
Warum wählen Sie viermal hintereinander aus derselben Datenbank aus?
Madara's Ghost
Und was passiert, wenn Sie eine weitere Buslinie ( bus_stops bs5) benötigen , um die Route abzuschließen?
FrustratedWithFormsDesigner