I have two tables: Route and Stop (one to many). And also I have input data: two location IDs which is related to ‘stop’ table. Every route has it’s own ORDERED list of stops. I need to select Route based on the stops order (OLNY where stop.order is ascending) having start and finish locations.
Data example:
| 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 |
---------------------------
USE CASE: for example, i have 3 locations: Los Angeles (id=1), Chicago (id=2) and New York (id=3). Also there are 2 bus routes: LA to NY and NY to LA. It means i have 3 bus-stops based on given locations for every route but they have opposite order. So i need to create MySQL query to select appropriate route having start and finish locations. For example if i have Chicago as starting point and LA as finish, the query have to return to me NY to LA route. If i have Chicago and NY locations – it should get LA to NY route.
That’s the query i was able to create but of course it doesn’t work
SELECT `route`.*
FROM `route`
WHERE (SELECT stop.order FROM `stop` WHERE stop.locationId = 1) < (
SELECT stop.order FROM `stop` WHERE stop.locationId = 2)
(where 1 and 2 are location IDs input data)
I need to have this result if i have loc_id 1 and 2
--------------------
| id | name |
--------------------
| 1 | first |
--------------------
Therefore, if loc_id = 2 and 1 i need to have next result:
--------------------
| id | name |
--------------------
| 2 | second |
--------------------
Advertisement
Answer
Try this:
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);