2017-02-01 11 views
0

У меня есть 3 таблицы:Сравнение различных строк в SQL

Section (id, origin, destination, departure_time, arrival_time) 
1 - city1 - city2 - 2017-01-01 10:00:00 - 2017-01-01 12:00:00 
2 - city2 - city3 - 2017-01-01 12:00:00 - 2017-01-01 13:00:00 
3 - city3 - city4 - 2017-01-01 13:00:00 - 2017-01-01 15:00:00 
4 - city4 - city5 - 2017-01-01 15:00:00 - 2017-01-01 16:30:00 

Trip_Section(trip_id, section_id) 
1 - 1 
1 - 2 
1 - 3 
1 - 4 

Trip(id, from, to, departure_time) 
1 - city1 - city5 - 2017-01-01 10:00:00 

Таблица разделы содержат все остановки от поездки, и мне нужно найти все поездки, которые содержат происхождение и назначение запрашивало. В этой части я пытаюсь восстановить поездки с параметрами в разных разделах. Например: я хочу путешествовать с City2 в City4 так что мой запрос:

select ts.trip_id, count(ts.trip_id) >= 2 from Section as s 
inner join Trip_Section ts on ts.sections_id = s.id 
where (s.origin = 'city2' OR s.destination = 'city4') 
GROUP BY ts.trip_id having count(ts.trip_id) >= 2; 

и результат является правильным, но если я поиск от City4 к City2, результат не является пустым, то же самое, чем первый случай.

Как я могу сравнить разные строки, чтобы возвращать только строки, когда время начала отправления будет меньше, чем время отправления отправления (или другая возможность проверить идентификатор назначения больше, чем id источника). Может кто-нибудь мне помочь?

+0

«и правильный результат» - Как это возможно с синтаксической ошибки в запросе? Вероятно, вы имеете в виду 'OR s.destination = 'city4''. –

+0

И s.arrival_time> s.departure_time? – Stv

+0

Я не понимаю - вы не показываете столбцы с именем 'origin_id' или' destination_id' в своей модели данных - как этот sql запускается вообще? – Hogan

ответ

0
  • Найдите раздел с origin = 'city2'
  • Найти путевую для этого раздела
  • Найдите раздел из тех же поездок с destionation='city4'
  • Найти все разделы из этой поездки между двумя секциями выше

Все в одном запросе:

select tso.trip_id, s.* 
from Section so 
join Trip_Section tso on tso.section_id = so.id 
join Trip_Section tsd on tsd.trip_id = tso.trip_id 
join Section sd  on sd.id = tsd.section_id 
join Trip_Section ts on ts.trip_id = tso.trip_id 
join Section s  on s.id = ts.section_id 
where so.origin  = 'city1' 
    and sd.destination = 'city4' 
    and so.departure_time <= sd.departure_time 
    and s.departure_time >= so.departure_time 
    and s.departure_time <= sd.departure_time 

Это даст вам обзор всех остановок между двумя городами за поездку.

Если вам не нужны все остановки вы также можете попробовать это:

select tso.trip_id, so.origin, so.departure_time, sd.destination, sd.arrival_time 
from Section so 
join Trip_Section tso on tso.section_id = so.id 
join Trip_Section tsd on tsd.trip_id = tso.trip_id 
join Section sd  on sd.id = tsd.section_id 
where so.origin  = 'city2' 
    and sd.destination = 'city4' 
    and so.departure_time <= sd.departure_time 

http://rextester.com/XUOYS38451

+0

это работает совершенно !! Большое спасибо!! –

+0

Хотя это не совсем то, о чем вы просили. Но таким образом у вас есть обзор со всеми остановками между двумя городами. –

+0

Мне нужны только экскурсии, а не разделы, но я над этим работаю. Спасибо! –

Смежные вопросы