【问题标题】:Return 1 result per left join每个左连接返回 1 个结果
【发布时间】:2014-05-18 20:51:15
【问题描述】:

目前我正在对两个表执行左连接。第一个表有一个 id 和一个人名,第二个表有一个 id,表 1 中一个人的 id,然后是时间戳(他们最后一次飞行的)。

People                             Flights
id   |  name             id   |   person_id   | time
------------             ---------------------------
1       Dave              1         1          1284762115
2       Becky             2         1          1284787352
                          3         2          1284772629
                          4         2          1286432934
                          5         1          1289239480

当我执行左连接时,我会得到一份人员列表及其飞行时间,但我想要的只是人员列表及其最后一次飞行时间。

所以 SELECT p.id, p.name, f.time FROM People p LEFT JOIN Flights f ON p.id = f.person_id

返回

1 Dave  1284762115
1 Dave  1284787352
1 Dave  1289239480
2 Becky 1284772629
2 Becky 1286432934

我只想看看:

1 Dave  1289239480
2 Becky 1286432934

所以我只需要返回具有最高 f.id 或最高 f.time 的匹配项

【问题讨论】:

    标签: sql join filter left-join


    【解决方案1】:
    SELECT
        p.id, p.name, MAX(f.time) AS LastFlight
    FROM
        People p
        LEFT JOIN Flights f ON p.id = f.person_id
    GROUP BY
        p.id, p.name
    

    【讨论】:

      【解决方案2】:
      SELECT p.id, p.name, f.time FROM People p LEFT JOIN 
        (select person_id, max(time) time from flights group by person_id) f 
      ON p.id = f.person_id
      

      【讨论】:

      • max(time) 我认为需要一个列别名?
      • 是的,我不小心把它漏掉了;固定。
      • 这个答案比接受的答案有帮助,因为我的包装选择语句已经有很多列,我也不想在 group by 语句中指定。
      【解决方案3】:

      试试这个:

      ;with LastFlightTimes as 
      (
      select person_id, max(id) maxid
      from Flights f
      group by person_id
      )
      SELECT p.id, p.name, f.time FROM People p 
      LEFT JOIN LastFlightTimes lft ON p.id = lft.person_id
      left join Flights f on f.id = lft.maxid
      

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 2015-11-01
        相关资源
        最近更新 更多