Вернуть 1 результат за левое соединение - PullRequest
2 голосов
/ 18 сентября 2010

В настоящее время я выполняю левое соединение на двух столах.В первой таблице есть идентификатор и имя человека, во второй таблице есть идентификатор, идентификатор человека из таблицы 1, а затем отметка времени (последнего полета, который у них был).

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

КогдаЯ выполняю свое левое соединение, я получаю список людей и их время полета, но мне бы хотелось, чтобы это был просто список людей с их последним временем полета.f.time ИЗ ЛЮДЕЙ p ВЕРНУТЬСЯ В ЛЕТПоэтому мне нужно вернуть только совпадение с самым высоким f.id или самым высоким f.time

Ответы [ 3 ]

5 голосов
/ 18 сентября 2010
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 голосов
/ 18 сентября 2010
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
1 голос
/ 18 сентября 2010

Попробуйте это:

;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
...