我有3张桌子:
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,结果不为空,则与第一种情况相同。
当原点的departure_time小于目的地的departure_time时,我如何比较不同的行只返回行(或另一个可能性是检查目的地的id是否大于原点的id)。 有人能帮助我吗?
答案 0 :(得分: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