如何从SQL

时间:2017-03-17 00:42:30

标签: mysql sql tsql

我被http://www.sql-ex.ru/learn_exercises.php#answer_ref的练习68困住了。

数据库由以下四个表组成:

  1. 公司(ID_comp,姓名)
  2. 旅行(trip_no,id_comp,plane,town_from,town_to,time_out,time_in)
  3. 乘客(ID_psg,姓名)
  4. Pass_in_trip(trip_no,date,ID_psg,place)
  5. 演习的目的是: 找出航班数量(旅行)最多的航线数量。 笔记。

    1. A - B和B - A被视为相同的路线。
    2. 仅使用Trip表。
    3. 我可以得到“找出航班数量(行程次数最多)的路线数量”的正确答案,但在考虑注释1时则不能:A - B和B - A被认为是相同路线。

      我不知道如何获得独特的配对: 如果我们有输出:

      | town_from | town_to   | count |
      | --------- | --------- | ----- |
      | London    | Singapore | 4     |
      | Singapore | London    | 4     |
      

      如何选择以便它只给我

      | town_from | town_to   | count |
      | --------- | --------- | ----- |
      | London    | Singapore | 4     |
      

      我能够通过以下查询完成此问题:

      WITH x AS( SELECT con,sum(c)as s FROM( SELECT town_from,town_to,'con'= CASE WHEN lower(town_from)

      SELECT count(*)FROM x WHERE =(SELECT max(s)FROM x)

2 个答案:

答案 0 :(得分:2)

您需要以表示from-&gt;的方式查看Trip表格,方法与从&gt;表示的方式相同。执行此操作的典型方法是确保始终对其进行排序town_from <(=) town_to

通常来说,以下查询将以这种方式投影Trip。 case子句从和从周围切换以保持它们始终排序:

select trip_no, id_comp, plane, 
    case when town_from < town_to then town_from else town_to end as town_from, 
    case when town_from < town_to then town_to else town_from end as town_to, 
    time_out, time_in
from Trip

然后,您可以在查询中选择此投影:

select ...
from (
    select trip_no, id_comp, plane, 
        case when town_from < town_to then town_from else town_to end as town_from, 
        case when town_from < town_to then town_to else town_from end as town_to, 
        time_out, time_in
    from Trip
) as x

要解决这个特殊问题,我们可以应用相同的逻辑,但删除不必要的列(优化器应该这样做但无论如何它对人眼看起来更干净):

select town_from, town_to, count(*)
from (
    select 
        case when town_from < town_to then town_from else town_to end as town_from, 
        case when town_from < town_to then town_to else town_from end as town_to 
    from Trip
) as x
group by town_from, town_to

注意:如果我错了,请纠正我,但在您的预期输出中,伦敦&lt; - &gt;新加坡的总人数应该 8 ,而不是 4 。您在一个方向上有4次旅行,在另一个方向上有4次旅行,共计8次。

然后我们可以使用相同的查询来查找最大数量的航班,然后查找具有该号码的航线,然后计算。我怀疑你有这个部分,但这是一个练习。

答案 1 :(得分:0)

select a.town_from, a.town_to, count(a.plane) ta from (
select plane, 
(case when town_from < town_to then town_from else town_to end) as town_from, 
(case when town_from < town_to then town_to else town_from end) as town_to 
from trip) as a
group by a.town_from, a.town_to
having count(a.plane) >= all (select count(plane) from trip group by plane, town_from, town_to)) s```