Как временно сохранить результат запроса, чтобы использовать его в другом?

12

У меня есть эта проблема, я думаю, вы можете помочь мне.
PS Я не знаю, как это назвать, поэтому, если кто-то найдет более подходящее название, пожалуйста, отредактируйте.

Фон

  • Я делаю это приложение для поиска автобусных транзитных линий.
  • Автобусные линии представляют собой трехзначное число, они уникальны и никогда не изменятся.
  • Требуется уметь искать строки от остановки А до остановки Б.
  • Пользовательский интерфейс уже успешно намекает пользователю использовать только действительные имена остановок.
  • Требуется уметь отображать, есть ли у маршрута прямая линия, а если нет, отображать комбинацию из 2 и даже 3 строк.

Пример:

Мне нужно добраться из пункта А в пункт D. Программа должна показать:

  • Если есть прямая линия AD.
  • Если нет, отобразите альтернативу, 2-строчные комбинации, такие как AC, CD.
  • Если нет двухстрочных комбинаций, найдите трехстрочные комбинации: AB, BC, CD.

Конечно, приложение должно отображать номера шинных линий, а также когда переключать шины.

Что я имею:

Моя база данных структурирована следующим образом (упрощенно, фактическая база данных включает местоположения и время и тому подобное):

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

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

Где lines_stops_relationshipописывают отношения «многие ко многим» между автобусными линиями и остановками.

Порядок означает порядок, в котором остановки отображаются в одной строке. Не все строки идут вперед и назад, и порядок имеет значение (точка A с порядком 2 идет после точки B с порядком 1).

Проблема

  • Мы выясняем, может ли линия пройти по маршруту достаточно легко. Просто найдите одну линию, которая проходит через обе точки в правильном порядке.
  • Как я могу найти, если есть 2/3 строки комбо? Я думал о том, чтобы найти линию, которая соответствует исходной остановке, и одну для конечной остановки, и посмотреть, смогу ли я получить общую остановку между ними, где пользователь может переключать автобусы. Как я помню эту остановку?
  • Комбинация из 3 строк еще сложнее, я нахожу строку для источника и строку для пункта назначения, и что дальше? Я думаю, что искать строку с 2 остановками, но опять же, Как мне запомнить остановки?

ТЛ; др

Как я помню результаты запроса, чтобы иметь возможность использовать его снова? Я надеюсь достичь этого в одном запросе (для каждого - запрос для 1-строчных маршрутов, запрос для 2-х и запрос для 3-строчных комбинаций).

Примечание: я не против, если кто-то предложит совершенно иной подход, чем тот, который у меня есть, я открыт для любых решений.

Наградит любую помощь с cookie и upvote. Заранее спасибо!

Призрак Мадары
источник
@eggyal: у меня нет расстояний по узлам. Кроме того, я ограничен в движении внутри сети (т. Е. Только определенные автобусные линии перемещаются из точки А в точку Б). Это все еще полезно для меня?
Призрак Мадары
Для этого я бы также предложил использовать хранимую процедуру над одним запросом, если это возможно сделать одним запросом. Там вы можете легко хранить результаты / переменные и использовать их повторно.
1
@ Правда, вероятно, лучше всего дать вам несколько советов: mysqltutorial.org/stored-procedures-loop.aspx (петли), mysqltutorial.org/… (случаи) - в сочетании с чем-то вроде алгоритма dijkstra, вы должны быть в состоянии решить ваши проблема. По сути, это похоже на функцию PHP - но на MySQL
1
Кажется, уже в переполнении стека - эта ссылка имеет несколько решений, хотя в настоящее время нет ни одного в MySQL. (Есть несколько ответов, которые не суммируют легко, и гниль ссылок, вероятно, не является проблемой, поскольку, если этот сайт пропадает, то, вероятно, и тот.
PSR

Ответы:

3

Возможно, вы не захотите вносить радикальные изменения в этот момент, но то, что вы описываете, является именно примером использования для баз данных графиков . Графовые базы данных основаны на теории графов, к которой вы обращаетесь, пытаясь найти путь между «X» и «Y» через ориентированный граф автобусных маршрутов.

Если вы еще не знакомы с ним, взгляните на что-то вроде Neo4J . У него есть REST API, и вы можете найти для него PHP-клиентов .

Вы найдете кучу людей Stack Overflow , которые могли бы помочь с стороной реализации вещей.

Дэн МакГрат
источник
1
Сейчас я нахожусь в стадии мышления, я могу изменить что угодно. Я проверю ваши ссылки. Кроме того, этот вопрос возник из Переполнения стека , я знаю, что они могут помочь мне реализовать его :)
Призрак Мадары
1
Я собирался предложить рекурсивные запросы, но, похоже, MySQL не поддерживает их, поэтому этот ответ может быть лучше.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Возможно, очень неудобное решение MySQL, которое объединит SP и список смежности, но я не думаю, что стоит даже подумать об этом.
Яннис
@YannisRizos: Может быть, это хороший вызов для игры в гольф, может быть? ;)
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner Нет, это хороший код для игры в гольф
Яннис
0

Допустим, пользователь хочет перейти $start_idк $end_id(оба являются действительными значениями stop_id). Вы можете использовать эти запросы , чтобы найти правильный маршрут от $start_idдо $end_id:

  1. Поиск прямого маршрута (одиночная линия):

    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. Если по предыдущему запросу результата нет, ищите маршрут, используя 2 строки:

    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
    

Замените *поля, которые вам действительно нужно получить.

Jocelyn
источник
Привет Джоселин и добро пожаловать! Пожалуйста , внимательно прочитайте нашу справочную страницу по редактированию, чтобы узнать, как максимально эффективно использовать Markdown. Я отредактировал ваш ответ на этот раз, вы можете проверить его историю изменений, чтобы увидеть, какие изменения я сделал.
Яннис
Почему вы выбираете одну и ту же базу данных 4 раза подряд?
Призрак Мадары
А что произойдет, если вам понадобится еще одна автобусная линия ( bus_stops bs5) для завершения маршрута?
FrustratedWithFormsDesigner