Como salvar temporariamente o resultado da consulta, para usar em outro?


12

Eu tenho esse problema, acho que você pode me ajudar.
PS Não sei bem como chamar isso, portanto, se alguém encontrar um título mais apropriado, edite-o.

fundo

  • Estou fazendo este aplicativo para pesquisar linhas de transporte público.
  • As linhas de ônibus são um número de 3 dígitos e são únicas e nunca serão alteradas.
  • O requisito é poder procurar linhas da parada A à parada B.
  • A interface do usuário já conseguiu sugerir ao usuário que use apenas nomes de parada válidos.
  • O requisito é poder exibir se uma rota possui uma linha direta e, se não, exibir uma combinação de 2 e até 3 linhas.

Exemplo:

Preciso ir do ponto A ao ponto D. O programa deve mostrar:

  • Se houver uma linha direta AD.
  • Caso contrário, exiba alternativos combos de 2 linhas, como AC, CD.
  • Se não houver combos de duas linhas, procure combos de três linhas: AB, BC, CD.

Obviamente, o aplicativo deve exibir os números das linhas de ônibus, bem como quando trocar de ônibus.

O que eu tenho:

Meu banco de dados está estruturado da seguinte forma (simplificado, o banco de dados real inclui locais e horários e outros enfeites):

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

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

Onde lines_stops_relationshipdescrever uma relação de muitos para muitos entre as linhas de ônibus e as paradas.

Ordem, significa a ordem na qual as paradas aparecem em uma única linha. Nem todas as linhas se alternam e a ordem tem significado (o ponto A da ordem 2 vem depois do ponto B da ordem 1).

O problema

  • Descobrimos se uma linha pode atravessar a rota com bastante facilidade. Basta procurar por uma única linha que passe pelos dois pontos na ordem correta.
  • Como posso descobrir se existe uma combinação de 2/3 de linha? Eu estava pensando em procurar uma linha que corresponda à parada de origem e uma para a parada de destino, e ver se consigo uma parada comum entre elas, onde o usuário possa trocar de ônibus. Como me lembro dessa parada?
  • A combinação de 3 linhas é ainda mais complicada, acho uma linha para a fonte e outra para o destino, e depois? Procure uma linha com 2 paradas, eu acho, mas novamente, como me lembro das paradas?

tl; dr

Como me lembro dos resultados de uma consulta para poder usá-lo novamente? Espero conseguir isso em uma única consulta (para cada uma, uma consulta para rotas de 1 linha, uma consulta para 2 e uma consulta para combos de 3 linhas).

Nota: Não me importo se alguém sugerir uma abordagem completamente diferente da minha, estou aberto a qualquer solução.

Premiará qualquer assistência com um cookie e um voto positivo. Desde já, obrigado!



@eggyal: Não tenho distâncias entre os nós. Além disso, tenho movimento limitado dentro da rede (ou seja, apenas certas linhas de ônibus se movem do ponto A para o ponto B). Ainda é útil para mim?
Ghost de Madara

Eu também sugeriria usar um procedimento armazenado em uma única consulta para isso - se for possível fazê-lo com uma única consulta. Lá você pode facilmente armazenar resultados / variáveis ​​e reutilizá-los.

1
@ Verdade É provavelmente o melhor para lhe dar algumas dicas: mysqltutorial.org/stored-procedures-loop.aspx (loops), mysqltutorial.org/… (cases) - combinado com algo como o algoritmo dijkstra, você poderá resolver seu problema problema. Basicamente, é como uma função php - mas no mysql

1
Parece já estar no Stack Overflow - este link tem várias soluções, embora nenhuma esteja no MySQL no momento. (Existem várias respostas que não resumem facilmente e a podridão do link provavelmente não é um problema, pois se o site desaparecer, provavelmente este também o fará. Além disso, ele tem muitos votos positivos).
psr

Respostas:


3

Talvez você não queira fazer uma mudança drástica neste momento, mas o que você descreve é ​​exatamente o caso de uso dos bancos de dados de gráficos . Os bancos de dados de gráficos baseiam-se na teoria dos grafos, que é o que você toca ao tentar encontrar um caminho entre 'X' e 'Y' através de um gráfico direcionado de rotas de ônibus.

Se você ainda não pesquisou em um, dê uma olhada em algo como o Neo4J . Possui uma API REST e você pode encontrar clientes PHP para isso.

Você encontrará várias pessoas do Stack Overflow que podem ajudar no lado da implementação.


1
Atualmente, estou na fase do pensamento, posso mudar qualquer coisa. Vou verificar seus links. Além disso, essa pergunta veio de estouro de pilha , eu sei que eles podem me ajudar a implementá-lo :)
O fantasma de Madara

1
Eu sugeriria consultas recursivas, mas parece que o MySQL não suporta aquelas, então essa resposta pode ser melhor.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Pode haver uma solução MySQL muito incômoda que combine SP e uma lista de adjacências, mas acho que nem vale a pena pensar nisso.
precisa

@YannisRizos: Pode ser um bom desafio para o código de golfe, talvez? ;)
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesigner Nah, este é um desafio de golfe bom código
yannis

0

Digamos que um usuário queira ir de $start_idpara $end_id(ambos são valores válidos de stop_id). Você pode usar essas consultas para encontrar uma rota válida de $start_idpara $end_id:

  1. Pesquisa por rota direta (linha ú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. Se não houver resultado na consulta anterior, pesquise uma rota usando 2 linhas:

    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

Substitua *pelos campos que você realmente precisa recuperar.


Olá Jocelyn e bem-vindo! Leia nossa página de ajuda de edição completamente para descobrir como você pode tirar o máximo proveito do Markdown. Desta vez, editei sua resposta. Você pode verificar o histórico de revisões para ver quais edições fiz.
Yannis 6/06/12

Por que você está selecionando no mesmo banco de dados 4 vezes seguidas?
Ghost de Madara

E o que acontece se você precisar de mais uma linha de ônibus ( bus_stops bs5) para completar o percurso?
FrustratedWithFormsDesigner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.