Як тимчасово зберегти результат запиту, використовувати в іншому?


12

У мене є ця проблема, я думаю, ви можете мені допомогти.
PS Я не впевнений, як це назвати, тому, якщо хтось знайде більш відповідну назву, будь ласка, відредагуйте.

Фон

  • Я роблю цю програму для пошуку автобусних маршрутів.
  • Автобусні лінії - це трицифрове число і є унікальним і ніколи не зміниться.
  • Вимога полягає в тому, щоб мати можливість шукати лінії від зупинки A до зупинки B.
  • Користувальний інтерфейс вже успішно натякає користувачеві використовувати лише дійсні імена зупинки.
  • Вимога полягає в тому, щоб мати змогу відображати, якщо маршрут має пряму лінію, а якщо ні - відображати 2-лінію та навіть 3-лінійну комбінацію.

Приклад:

Мені потрібно пройти з точки А до точки D. Програма повинна показувати:

  • Якщо є пряма лінія AD.
  • Якщо ні, виведіть альтернативні дворядкові комбінації, такі як змінна, компакт-диск.
  • Якщо немає 2-рядкових комбо, знайдіть 3-рядкові комбінації: AB, BC, CD.

Звичайно, додаток має відображати номери автобусних ліній, а також коли перемикати автобуси.

Що я маю:

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

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

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

Де lines_stops_relationshipописуємо багато-багато-багато зв’язок між автобусними лініями та зупинками.

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

Проблема

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

тл; д-р

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

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

Буде нагороджено будь-яку допомогу файлом cookie та нагородою. Спасибі заздалегідь!



@eggyal: У мене немає відстаней над вузлами. Крім того, я обмежений у русі всередині мережі (тобто лише певні автобусні лінії рухаються від точки A до точки B). Це все ще корисно для мене?
Привид

Я б також запропонував використовувати для цього збережену процедуру над одним запитом - якщо це навіть можливо зробити за допомогою одного запиту. Там ви можете легко зберігати результати / змінні та використовувати їх повторно.

1
@Truth Це, мабуть, найкраще дати вам декілька підказок : mysqltutorial.org/stored-procedures-loop.aspx (loops), mysqltutorial.org/… (випадки) - у поєднанні з чимось на зразок алгоритму dijkstra, ви зможете вирішити свій проблема. В основному, це як функція php - але в mysql

1
Здається, він вже знаходиться у переповнюванні стека - це посилання має декілька рішень, хоча наразі жодне з них не є в MySQL. (Є кілька відповідей, які не підсумовують легко, а гниття посилань, мабуть, не є проблемою, оскільки, якщо цей веб-сайт відходить, цей, ймовірно, і так добре. Плюс, він має багато відгуків).
пн

Відповіді:


3

Ви, можливо, не захочете зробити це кардинальним зміною на даний момент, але те, що ви описуєте, є саме випадком використання для графічних баз даних . Бази даних графіків ґрунтуються на теорії графів, до чого ви торкаєтесь, намагаючись знайти шлях між "X" та "Y" через спрямований графік автобусних маршрутів.

Якщо ви ще не вивчали жодного, погляньте на щось на зразок Neo4J . Він має API REST, і ви можете знайти клієнтів PHP для нього.

Ви знайдете купу людей із переповнення стека, які могли б допомогти у виконанні речей.


1
Зараз я перебуваю на фазі мислення, можу змінити що завгодно. Я перевірю ваші посилання. Також це запитання виникло від Stack Overflow , я знаю, що вони можуть мені допомогти здійснити його :)
Ghost Madara

1
Я збирався запропонувати рекурсивні запити, але, схоже, MySQL не підтримує їх, тому ця відповідь може бути кращою.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Можливо, буде дуже незручне рішення MySQL, яке поєднало б SP та список суміжності, але я не думаю, що навіть варто витрачати час на це.
янніс

@YannisRizos: Можливо, це буде гарним завданням для гольфу з кодом, можливо? ;)
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

Замініть *поля, які вам дійсно потрібно отримати.


Привіт Джоселін і ласкаво просимо! Будь ласка, уважно прочитайте нашу довідкову сторінку з редагування, щоб дізнатися, як можна максимально використати Markdown. Цього разу я відредагував вашу відповідь, ви можете перевірити історію редагування, щоб побачити, які зміни я внесла.
янніс

Чому ви вибираєте з однієї бази даних 4 рази поспіль?
Привид

А що станеться, якщо для завершення маршруту вам потрібна ще одна автобусна лінія ( bus_stops bs5)?
FrustratedWithFormsDesigner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.