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

12

Ho questo problema, penso che potresti aiutarmi con.
Post scriptum Non sono sicuro di come chiamare questo, quindi se qualcuno trova un titolo più appropriato, ti preghiamo di farlo.

Sfondo

  • Sto facendo questa applicazione per cercare le linee di transito degli autobus.
  • Le linee di bus sono un numero a 3 cifre, sono uniche e non cambieranno mai.
  • Il requisito è essere in grado di cercare le linee dalla fermata A per interrompere B.
  • L'interfaccia utente ha già successo nel suggerire all'utente di utilizzare solo nomi di stop validi.
  • Il requisito deve essere in grado di visualizzare se una rotta ha una linea diretta e, in caso contrario, visualizzare una combinazione a 2 e persino a 3 righe.

Esempio:

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

  • Se esiste una linea diretta A-D.
  • In caso contrario, visualizza combinazioni di 2 linee alternative, come A-C, C-D.
  • Se non ci sono combo a 2 righe, cerca combo a 3 righe: A-B, B-C, C-D.

Ovviamente, l'app dovrebbe visualizzare i numeri di linea del bus, nonché quando cambiare i bus.

Cosa ho:

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

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

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

Dove lines_stops_relationship descrive una relazione molti-a-molti tra le linee del bus e le fermate.

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

Il problema

  • Scopriamo se una linea può attraversare il percorso abbastanza facilmente. Cerca solo una singola linea che attraversi entrambi i punti nell'ordine corretto.
  • Come posso trovare se c'è una combinazione di 2/3 linee? Stavo pensando di cercare una linea che corrisponda alla fermata della sorgente e una alla fermata della destinazione, e vedere se riesco a ottenere una fermata comune tra loro, dove l'utente può cambiare autobus. Come faccio a ricordare che smetti?
  • La combinazione di 3 linee è ancora più complicata, trovo una linea per la fonte e una linea per la destinazione, e poi? Cerca una linea che ha 2 stop, suppongo, ma ancora, Come ricordo le fermate?

tl; dr

Come ricordo i risultati di una query per poterlo riutilizzare? Spero di ottenere questo risultato in una singola query (per ciascuna, una query per i percorsi a 1 linea, una query per 2 e una query per le combo a 3 righe).

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

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

    
posta Madara Uchiha 06.06.2012 - 11:36
fonte

2 risposte

3

A questo punto potresti non voler rendere drastico questo cambiamento, ma quello che descrivi è esattamente il caso d'uso per Database di grafici . I database dei grafici si basano sulla teoria dei grafi, che è ciò a cui stai lavorando cercando di trovare un percorso tra "X" e 'Y' attraverso un grafico diretto di linee di autobus.

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

Troverai un gruppo di persone di Overflow dello stack che potrebbero aiutarti con il lato dell'implementazione.

    
risposta data 06.06.2012 - 14:01
fonte
0

Diciamo che un utente vuole passare da $start_id a $end_id (entrambi sono valori stop_id validi). Puoi utilizzare queste query per trovare un percorso valido da $start_id a $end_id :

  1. Cerca il 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 una rotta 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.

    
risposta data 06.06.2012 - 13:05
fonte

Leggi altre domande sui tag