MySQL: выберите, только если значения полей возрастают

У меня есть две таблицы: Route и Stop (один ко многим). А также у меня есть входные данные: два идентификатора местоположения, которые связаны с таблицей «стоп». У каждого маршрута есть свой УПОРЯДОЧЕННЫЙ список остановок. Мне нужно выбрать маршрут на основе порядка остановок (OLNY, где stop.order восходит), имеющих начальную и конечную точки.

Пример данных:

| ROUTE            |
--------------------
| id | name        |
--------------------
| 1 | first        |
--------------------
| 2 | second       |
--------------------

---------------------------
| STOP                    |
---------------------------
|id | order |loc_id|route_id|
----------------------------
| 1 | 1     |  1   |  1   |
---------------------------
| 2 | 2     |  2   |  1   |
---------------------------
| 3 | 3     |  3   |  1   |
---------------------------
| 4 | 3     |  1   |  2   |
---------------------------
| 5 | 2     |  2   |  2   |
---------------------------
| 6 | 1     |  3   |  2   |
---------------------------

ПРИМЕР ИСПОЛЬЗОВАНИЯ: например, у меня есть 3 местоположения: Лос-Анджелес (id=1), Чикаго (id=2) и Нью-Йорк (id=3). Также есть 2 автобусных маршрута: из Лос-Анджелеса в Нью-Йорк и из Нью-Йорка в Лос-Анджелес. Это означает, что у меня есть 3 автобусные остановки в зависимости от заданных мест для каждого маршрута, но они имеют противоположный порядок. Поэтому мне нужно создать запрос MySQL, чтобы выбрать соответствующий маршрут с начальным и конечным местоположением. Например, если у меня есть Чикаго в качестве отправной точки и Лос-Анджелес в качестве финиша, запрос должен вернуть мне маршрут из Нью-Йорка в Лос-Анджелес. Если у меня есть места в Чикаго и Нью-Йорке, он должен получить маршрут из Лос-Анджелеса в Нью-Йорк.

Это запрос, который я смог создать, но, конечно, он не работает

SELECT `route`.* 
FROM `route`
WHERE (SELECT stop.order FROM `stop` WHERE stop.locationId = 1) < (
        SELECT stop.order FROM `stop` WHERE stop.locationId = 2)

(где 1 и 2 — входные данные идентификаторов местоположений)

Мне нужен этот результат, если у меня есть loc_id 1 и 2

--------------------
| id | name        |
--------------------
| 1 | first        |
--------------------

Следовательно, если loc_id = 2 и 1, мне нужно получить следующий результат:

--------------------
| id | name        |
--------------------
| 2 | second       |
--------------------

Как мы должны интерпретировать вашу STOP таблицу? Говорит ли это о том, что существуют маршруты между все из loc_id для каждого маршрута? Или что-то другое?

Tim Biegeleisen 30.05.2019 17:03

в таблице «Стоп» «loc_id» не может быть нулевым. И каждый маршрут имеет как минимум две связанные остановки

Sam Kruster 30.05.2019 17:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

SELECT R.id, R.name
FROM Stop S
INNER JOIN Route R ON R.id = S.route_id
WHERE 
S.loc_id = 1 AND 
EXISTS (SELECT Id FROM Stop F WHERE S.route_id = F.route_id AND F.order > S.order AND F.loc_id = 2);

Как бы вы использовали этот запрос в красноречивом Laravel?

Adriaan 17.10.2021 09:05

Другие вопросы по теме