MYSQL И запрос для удовлетворения в одном столбце
Цель проекта:
Мы разрабатываем время шины Api
, где пользователь будет искать шины.
Ниже приведены мои table structure
У меня есть следующий tables
автобусы
id | bus_name
Описание таблицы: Сохранить все имена автобусов
маршруты
id | route_name
Описание таблицы: Сохранить все названия городов
останавливается
id | stop_name
Описание таблицы: Все имена остановки
stop_orders
id | route_id | stop_id | stop_order
Описание таблицы: здесь я назначу стопы для справки столбца city и stop_order, чтобы определить, какие остановки рядом друг с другом
bus_timing
id | stop_order_id | bus_id | bus_timing | trip | trip_direction
Описание таблицы: Здесь я буду назначать шины для остановки маршрута вместе с временем, отключением и направлением
Ожидаемый результат:
-
Когда пользователь ищет между источником и получателем со временем, Api должен возвращать весь список автобусов со временем
-
Если прямые шины не там, то взаимосвязанные шины должны показывать
Например, если пользователь ищет между stop_8
до stop_18
с 01:00:00
до 12:00:00
, то все списки автобусов со временем должны показывать. Если прямые шины не там, чтобы перемещаться между двумя остановками, тогда список взаимосвязанных списков маршрутов должен показывать
Результат, который я получил,
PHP сопоставляет ассоциативный массив на основе условия
Настоящая проблема с результатами возврата
-
Он будет возвращать все шины, даже если шина только перемещается в stop_8
, но не stop_18
. Но мой результат должен возвращать только те шины, которые будут перемещаться между двумя остановками, я имею в виду, что он должен падать между обеими остановками.
-
Даже я понятия не имею, как найти список взаимосвязанных автобусов
-
Если временной диапазон длинный, тогда вероятность того, что одна и та же шина будет перемещаться (отключение и направление) несколько раз
Обновление
Все еще ищут ответ. Правильно, теперь у ответа есть некоторые моменты, так предлагаемые награды
Ответы
Ответ 1
Потому что stop_id
не может быть двух разных значений в одной строке.
Агрегация - это один из способов сделать то, что вы хотите:
SELECT b.bus_name
FROM buses b JOIN
route_connect rc
ON rc.busid = b.id JOIN
stops s
ON s.id = rc.stop_id
GROUP BY b.bus_name
HAVING SUM( s.stop_name = 'Sydney' ) > 0 AND
SUM( s.stop_name = 'Melbourne' ) > 0;
Это возвращает шины, у которых есть остановки с именем обоих городов.
Учитывая, что на автобусах может быть много остановок, это может быть более эффективным:
SELECT b.bus_name
FROM buses b JOIN
route_connect rc
ON rc.busid = b.id JOIN
stops s
ON s.id = rc.stop_id
WHERE s.stop_name in ('Sydney', 'Melbourne')
GROUP BY b.bus_name
HAVING COUNT(DISTINCT s.stop_name) = 2;
Ответ 2
Кроме того, если автобусы не перемещаются напрямую между двумя городами, мне нужно показать межподключенные шины.
Это серьезная проблема в классе проблем, называемых проблемы маршрутизации.. Для этого вам нужен лучший инструмент: рассмотрите возможность миграции или интеграции PostgreSQL и рассмотрите PgRouting, в частности, вам, скорее всего, понадобится Shorty Path Dijkstra. PgRouting работает поверх расширения PostGIS.
Или подумайте над тем, чтобы интегрироваться с Esri.
В качестве альтернативы вы можете обходиться с этим, но я бы не советовал это.
OQgraph (обновление)
Из symcbean в комментариях вы можете использовать движок базы данных OQgraph для этого. Ниже приведен пример кратчайший путь.