Come salvare temporaneamente il risultato della query, da utilizzare in un altro?


12

Ho questo problema, penso che potresti aiutarmi.
PS Non sono sicuro di come chiamare questo, quindi se qualcuno trova un titolo più appropriato, per favore modifica.

sfondo

  • Sto facendo questa applicazione per la ricerca di linee di transito degli autobus.
  • Le linee di autobus sono un numero di 3 cifre, è univoco e non cambierà mai.
  • Il requisito è poter cercare le linee dallo stop A allo stop B.
  • L'interfaccia utente è già riuscita a suggerire all'utente di utilizzare solo nomi di arresto validi.
  • Il requisito è essere in grado di visualizzare se un percorso ha una linea diretta e, in caso contrario, visualizzare una combinazione di 2 linee e persino di 3 linee.

Esempio:

Devo passare dal punto A al punto D. Il programma dovrebbe mostrare:

  • Se c'è una linea diretta AD.
  • In caso contrario, visualizza combinazioni di 2 righe alternative, come AC, CD.
  • Se non ci sono combinazioni di 2 righe, cerca le combinazioni di 3 righe: AB, BC, CD.

Naturalmente, l'app dovrebbe visualizzare i numeri delle linee degli autobus, nonché quando cambiare autobus.

Ciò che ho:

Il mio database è strutturato come segue (il database semplificato, effettivo include posizioni, orari e quant'altro):

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

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

Dove lines_stops_relationshipdescrivi una relazione molti-a-molti tra le linee di autobus e le fermate.

Ordine, indica l'ordine in cui le fermate appaiono in una sola riga. Non tutte le linee vanno avanti e indietro e l'ordine ha significato (il punto A con ordine 2 segue il punto B con ordine 1).

Il problema

  • Scopriamo se una linea può attraversare il percorso abbastanza facilmente. Basta cercare una singola riga che attraversa entrambi i punti nell'ordine corretto.
  • Come posso sapere se esiste una combinazione di 2/3 linee? Stavo pensando di cercare una linea che corrisponda alla fermata di origine, e una per la fermata di destinazione, e vedere se riesco a trovare una fermata comune tra loro, dove l'utente può cambiare bus. Come ricordo quella fermata?
  • La combinazione a 3 righe è ancora più complicata, trovo una riga per l'origine e una riga per la destinazione, e quindi cosa? Cerca una linea che ha 2 fermate immagino, ma ancora una volta, come ricordo le fermate?

tl; dr

Come ricordo i risultati di una query per poterlo riutilizzare? Spero di raggiungere questo obiettivo in una singola query (per ciascuno, una query per percorsi a 1 linea, una query per 2 e una query per combinazioni a 3 linee).

Nota: non mi importa se qualcuno suggerisce un approccio completamente diverso da quello che ho, sono aperto a qualsiasi soluzione.

Assegnerà qualsiasi assistenza con un cookie e un voto. Grazie in anticipo!



@eggyal: non ho distanze sui nodi. Inoltre, sono limitato nei movimenti all'interno della rete (ovvero solo alcune linee di autobus si spostano dal punto A al punto B). È ancora utile per me?
Madara's Ghost

Vorrei anche suggerire di utilizzare una procedura memorizzata su una singola query per questo - se è persino possibile farlo con una singola query. Lì puoi facilmente archiviare risultati / variabili e riutilizzarli.

1
@Truth Probabilmente è meglio darti alcuni tutorial : mysqltutorial.org/stored-procedures-loop.aspx (loop), mysqltutorial.org/… (casi) - combinato con qualcosa come l'algoritmo dijkstra, dovresti essere in grado di risolvere il tuo problema. Fondamentalmente, è come una funzione php - ma su mysql

1
Sembra essere già in Stack Overflow - questo collegamento ha più soluzioni anche se nessuna è attualmente in MySQL. (Esistono diverse risposte che non riassumono facilmente e che il collegamento del marcio probabilmente non è un problema poiché se quel sito va via anche questo probabilmente lo fa. Inoltre ha molti voti positivi).
psr

Risposte:


3

A questo punto, potresti non voler apportare questa drastica modifica, ma quello che descrivi è esattamente il caso d'uso per i database Graph . I database dei grafi si basano sulla teoria dei grafi, che è ciò su cui si sta toccando cercando di trovare un percorso tra 'X' e 'Y' attraverso un grafico diretto delle linee di autobus.

Se non ne hai già esaminato uno, dai un'occhiata a qualcosa come Neo4J . Ha un'API REST e puoi trovare client PHP per questo.

Troverai un sacco di persone di Stack Overflow che potrebbero aiutarti con il lato dell'implementazione delle cose.


1
Sono attualmente in fase di pensiero, posso cambiare qualsiasi cosa. Controllerò i tuoi link. Inoltre, questa domanda è arrivata da Stack Overflow , so che possono aiutarmi a implementarla :)
Madara's Ghost

1
Stavo per suggerire query ricorsive, ma sembra che MySQL non le supporti, quindi questa risposta potrebbe essere migliore.
FrustratedWithFormsDesigner,

@FrustratedWithFormsDesigner Potrebbe esserci una soluzione MySQL molto imbarazzante che combinerebbe SP e un elenco di adiacenza, ma non penso che valga la pena pensarci.
yannis,

@YannisRizos: potrebbe essere una buona sfida per il golf del codice, forse? ;)
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesigner Nah, questa è una buona sfida di golf con codice
yannis,

0

Supponiamo che un utente desideri passare da $start_ida $end_id(entrambi sono valori stop_id validi). È possibile utilizzare queste query per trovare un percorso valido da $start_ida $end_id:

  1. Cerca percorso diretto (linea singola):

    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. Se non ci sono risultati con la query precedente, cerca un percorso usando 2 linee:

    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

Sostituisci *con i campi che devi veramente recuperare.


Ciao Jocelyn e benvenuto! Leggi attentamente la nostra pagina di aiuto per la modifica per scoprire come ottenere il massimo da Markdown. Questa volta ho modificato la tua risposta, puoi controllare la cronologia delle revisioni per vedere quali modifiche ho apportato.
yannis,

Perché selezioni dallo stesso database 4 volte di seguito?
Madara's Ghost

E cosa succede se hai bisogno di un'altra linea di autobus ( bus_stops bs5) per completare il percorso?
FrustratedWithFormsDesigner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.