2015-08-18 4 views
0

базы данных составляет около автобусных перевозок таким образом, есть три таблицы:Как показать идентификатор из 1-й таблицы из 2-х различных идентификаторов из 2 таблицы

СТОП

stop_id | stop_name 
-------------------- 
    1 | station_1 
    2 | station_2 
    3 | station_3 

ROUTE

route_id | route_num 
-------------------- 
1  | route_1 
2  | route_2 
3  | route_3 

ROUTE_STOP

stop_id | route_id 
------------------ 
1  | 1 
2  | 1 
1  | 2 
3  | 2 
1  | 3 
2  | 3 
3  | 3 

Итак, 1-й маршрут имеет станции 1 и 2, 2-й маршрут - станции 1 и 3, а 3-й маршрут - все станции.

Попытка получить route_num, который проходит через station_1 и station_3:

SELECT distinct(r.route_num) from STOP s 
JOIN ROUTE_STOP rs 
ON s.stop_id = rs.stop_id 
JOIN ROUTE_STOP r_s 
ON rs.stop_id = r_s.stop_id 
JOIN ROUTE r 
ON rs.route_id = r.route_id 
WHERE s.stop_name='station_1' OR s.stop_name='station_3' 
AND rs.stop_id <> r_s.stop_id 

и результат должен быть route_2 и route_3, но он не работает. Если между станцией нет маршрута, результата не должно быть.

Как добраться route_num, который проходит через 2 станции, и нет результата, если между двумя станциями нет маршрута?

+0

Имеет ли порядок, в котором останавливаются материя? Это не записано в вашей схеме. – Strawberry

+0

Не имеет значения, появится поле 'time' в ROUTE_STOP, которое будет добавлено – Chiefster

ответ

0

Один из способов сделать это, чтобы присоединиться к таблицам и либо использовать in положение с group by и having count(), чтобы найти группы соответствия или группы по route_num и использовать имеющие пункт для фильтрации групп, которые имеют остановки вы хотите:

-- query 1 
SELECT r.route_num 
FROM ROUTE r 
JOIN ROUTE_STOP rs ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
WHERE s.stop_name IN ('station_1','station_3') 
GROUP BY r.route_num 
HAVING COUNT(DISTINCT s.stop_id) = 2; 

-- query 2 
SELECT r.route_num 
FROM ROUTE r 
JOIN ROUTE_STOP rs ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
GROUP BY r.route_num 
HAVING (SUM(CASE WHEN s.stop_name = 'station_1' THEN 1 ELSE 0 END) = 1) 
    AND (SUM(CASE WHEN s.stop_name = 'station_3' THEN 1 ELSE 0 END) = 1); 

Поскольку MySQL оценивает логические выражения как 1 или 0 вы можете уменьшить положение having в последнем запросе к:

HAVING (SUM(s.stop_name = 'station_1') = 1) 
    AND (SUM(s.stop_name = 'station_3') = 1); 

Оба запроса предполагают, что остановка может происходить более одного раза в маршруте (в случае маршрута, который начинается и заканчивается на той же станции).

Sample SQL Fiddle

0

Ваш запрос должен быть

SELECT r.route_num from route r 
JOIN ROUTE_STOP rs 
ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
WHERE s.stop_name in ('station_1','station_3'); 
Смежные вопросы