我有这张桌子:



我试图解决这样的问题:


  给出一个SQL查询,该查询返回的成本最低
  在每对城市之间飞行
  假设我们愿意在途中最多停两次。例如,通过停止一次(在
  丹佛),我们从SF到NY的票价为750,而不是750。在此示例中,我们可以停止
  两次(在丹佛和芝加哥),但价格会更高(300 + 250 + 250 = 800)。”


在此handout中,问题编号4b。

我只希望它只显示一个途中站点。

到目前为止,我有这个查询:

SELECT f1.fromCity, f2.toCity as destination, f1.toCity as scale, (MIN(f1.fare) + MIN(f2.fare)) as price
FROM flightfares f1, flightfares f2
WHERE f2.fromCity = f1.toCity
AND f1.fromCity != f2.toCity
GROUP BY f1.fromCity, f1.toCity, f2.toCity
HAVING MIN(f1.fare) AND MIN(f2.fare);


它会显示从一个城市到另一城市的数据,并带有1个停靠点和总价格。

我不确定从那里开始要解决该问题。
有人可以为我提供想法或解决方案吗?

编辑:
加入版本?

SELECT f1.fromCity, f2.toCity as destination, f1.toCity as scale, (min(f1.fare) + min(f2.fare)) as price
FROM flighfares f1
JOIN flighfares f2 ON(f2.fromCity = f1.toCity AND f1.fromCity != f2.toCity)
GROUP BY f1.fromCity, f1.toCity, f2.toCity
HAVING min(f1.fare) AND min(f2.fare);

最佳答案

此查询将根据您的给定数据仅解决一站式问题。该答案仅基于有问题的任务(4b)。希望这会有所帮助。

select * from
(select distinct start,dest,cost from pet
union
select distinct b.start,b.dest,MIN(total) cost
from
(select distinct a.start,(case when a.dest2 is null then dest1 else dest2 end)dest,(case when a.cost2 is NULL then a.cost1 else a.cost2+a.cost1 end) total
from (select t1.start,t1.dest dest1,t2.dest dest2,t1.cost cost1,t2.cost cost2
from pet t1 left join pet t2 on (t1.dest=t2.start and t1.start <> t2.dest))a)b group by b.start,b.dest order by cost)c
group by start,dest;


答案:

+---------+---------+------+
| start   | dest    | cost |
+---------+---------+------+
| Chicago | NY      |  250 |
| Denver  | Chicago |  250 |
| Denver  | NY      |  400 |
| Denver  | SF      |  250 |
| SF      | Chicago |  550 |
| SF      | Denver  |  300 |
| SF      | NY      |  700 |
+---------+---------+------+


对于更多的停止,此方法不能为您提供更多帮助。再说一次此答案仅适用于您提出的问题。

关于mysql - SQL-返回有1个途中停靠的最便宜航类的费用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46884798/

10-11 07:37