比较SQL

时间:2017-02-01 20:26:05

标签: mysql sql

我有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)。 有人能帮助我吗?

1 个答案:

答案 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

http://rextester.com/XUOYS38451