¿Cómo guardar temporalmente el resultado de la consulta, para usar en otra?

12

Tengo este problema, creo que me puede ayudar.
PD No estoy seguro de cómo llamar a esto, así que si alguien encuentra un título más apropiado, edítelo.

Antecedentes

  • Estoy haciendo esta aplicación para buscar líneas de tránsito de autobuses.
  • Las líneas de autobús son un número de 3 dígitos, es único y nunca cambiará.
  • El requisito es poder buscar líneas desde la parada A hasta la parada B.
  • La interfaz de usuario ya tiene éxito al indicar al usuario que solo use nombres de parada válidos.
  • El requisito es poder mostrar si una ruta tiene una línea directa, y si no, mostrar una combinación de 2 líneas e incluso 3 líneas.

Ejemplo:

Necesito ir del punto A al punto D. El programa debería mostrar:

  • Si hay una línea directa AD.
  • Si no, muestre combos alternativos de 2 líneas, como AC, CD.
  • Si no hay combos de 2 líneas, busque combos de 3 líneas: AB, BC, CD.

Por supuesto, la aplicación debe mostrar los números de línea de los autobuses, así como cuándo cambiar de autobús.

Lo que tengo:

Mi base de datos está estructurada de la siguiente manera (la base de datos simplificada y real incluye ubicaciones, horarios y demás):

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

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

Donde se lines_stops_relationshipdescribe una relación de muchos a muchos entre las líneas de autobús y las paradas.

Orden, significa el orden en que aparecen las paradas en una sola línea. No todas las líneas van y vienen, y el orden tiene significado (el punto A con el orden 2 viene después del punto B con el orden 1).

El problema

  • Averiguamos si una línea puede pasar por la ruta con bastante facilidad. Simplemente busque una sola línea que pase por ambos puntos en el orden correcto.
  • ¿Cómo puedo encontrar si hay un combo de 2/3 líneas? Estaba pensando en buscar una línea que coincida con la parada de origen, y una para la parada de destino, y ver si puedo obtener una parada común entre ellos, donde el usuario puede cambiar de autobús. ¿Cómo recuerdo esa parada?
  • El combo de 3 líneas es aún más complicado, encuentro una línea para la fuente y una línea para el destino, ¿y luego qué? Busque una línea que tenga 2 paradas, supongo, pero de nuevo, ¿cómo recuerdo las paradas?

tl; dr

¿Cómo recuerdo los resultados de una consulta para poder usarla nuevamente? Espero lograr esto en una sola consulta (para cada una, una consulta para rutas de 1 línea, una consulta para 2 y una consulta para combos de 3 líneas).

Nota: No me importa si alguien sugiere un enfoque completamente diferente al que tengo, estoy abierto a cualquier solución.

Otorgará cualquier ayuda con una cookie y un voto a favor. ¡Gracias por adelantado!

El fantasma de Madara
fuente
@eggyal: no tengo distancias sobre los nodos. Además, tengo un movimiento limitado dentro de la red (es decir, solo ciertas líneas de autobús se mueven del punto A al punto B). ¿Sigue siendo útil para mí?
El fantasma de Madara
También sugeriría usar un procedimiento almacenado en una sola consulta para esto, si es posible hacerlo con una sola consulta. Allí puede almacenar fácilmente resultados / variables y reutilizarlos.
1
@Truth Probablemente sea mejor darle algunos tuts: mysqltutorial.org/stored-procedures-loop.aspx (bucles), mysqltutorial.org/… (casos), combinados con algo como el algoritmo dijkstra, debería poder resolver su problema. Básicamente, es como una función php, pero en mysql
1
Parece que ya está en Stack Overflow : este enlace tiene múltiples soluciones, aunque ninguna está en MySQL en este momento. (Hay varias respuestas que no se resumen fácilmente y la pudrición de enlaces probablemente no sea un problema, ya que si ese sitio desaparece, este probablemente también lo haga. Además, tiene muchos votos a favor).
psr

Respuestas:

3

Es posible que no desee hacer un cambio tan drástico en este momento, pero lo que describe es exactamente el caso de uso de las bases de datos de gráficos . Las bases de datos de gráficos se basan en la teoría de gráficos, que es lo que está tratando al tratar de encontrar una ruta entre 'X' e 'Y' a través de un gráfico dirigido de rutas de autobuses.

Si aún no ha investigado uno, eche un vistazo a algo como Neo4J . Tiene una API REST y puede encontrar clientes PHP para ello.

Encontrará un montón de personas de Stack Overflow que podrían ayudar con el lado de la implementación de las cosas.

Dan McGrath
fuente
1
Actualmente estoy en la fase de pensamiento, puedo cambiar cualquier cosa. Comprobaré tus enlaces. Además, esta pregunta vino de Stack Overflow , sé que pueden ayudarme a implementarla :)
Madara's Ghost
1
Iba a sugerir consultas recursivas, pero parece que MySQL no las admite, por lo que esta respuesta podría ser mejor.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Puede haber una solución MySQL muy incómoda que combine SP y una lista de adyacencia, pero no creo que valga la pena pensarlo.
Yannis
@ YannisRizos: ¿Puede ser un buen desafío de golf de código, tal vez? ;)
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner No, este es un buen desafío de golf de código
Yannis
0

Digamos que un usuario quiere pasar de $start_ida $end_id(ambos son valores válidos de stop_id). Es posible utilizar estas consultas para encontrar una ruta válida a partir $start_idde $end_id:

  1. Buscar ruta directa (línea única):

    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. Si no hay resultados con la consulta anterior, busque una ruta con 2 líneas:

    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

Reemplace *con los campos que realmente necesita recuperar.

Jocelyn
fuente
Hola Jocelyn y bienvenido! Lea detenidamente nuestra página de ayuda de edición para descubrir cómo puede aprovechar al máximo Markdown. Esta vez he editado su respuesta, puede consultar su historial de revisiones para ver qué ediciones hice.
Yannis
¿Por qué selecciona de la misma base de datos 4 veces seguidas?
El fantasma de Madara
¿Y qué sucede si necesita una línea de autobús más ( bus_stops bs5) para completar la ruta?
FrustratedWithFormsDesigner