在两个连接的表中选择与最大值对应的列

时间:2015-11-11 17:04:49

标签: mysql sql

我有两张桌子,比如用户和访谈。一个用户可以拥有多个访谈记录。

Users
-----
UserID
FirstName
LastName

Interviews
----------
InterviewID
UserID
DateOfInterview

我想获得最新的采访记录。这是我的查询

select u.UserID, firstname, lastname, max(DateOfInterview) as latestDOI 
from users u 
left join interviews i 
on u.UserID = i.UserID 
GROUP BY u.UserID, firstname, lastname
ORDER BY max(DateOfInterview) DESC

如何更新查询以返回InterviewID(即对应于max(DateOfInterview)的那个)?

2 个答案:

答案 0 :(得分:1)

您可以在WHERE子句中使用聚合子查询,而不是在选择列表中使用聚合函数:

select u.UserID, firstname, lastname, i.InterviewId, DateOfInterview as latestDOI 
from users u 
left join interviews i 
  on u.UserID = i.UserID 
where i.UserId is null or i.DateOfInterview = (
  select max(DateOfInterview)
  from interviews i2
  where i2.UserId = u.UserId
)

这确实假设max(DateOfInterview)每个用户都是唯一的,但问题没有明确定义的答案。请注意,主查询不再是聚合查询,因此不适用此类查询的约束。

还有其他方法可以解决这个问题,因此查看它们是值得的,因为我提出的相关子查询可能是一个性能问题。例如,您可以使用内联视图生成每个用户最新访谈日期的表格,并使用该视图的连接来将用户与其最新访谈的ID相关联:

select u.*, im.latestDOI, i2.InterviewId
from
  users u
  left join (
      select UserID, max(DateOfInterview) as latestDOI 
      from interviews i
      group by UserID
    ) im
    on u.UserId = im.UserId
  left join interviews i2
    on im.UserId = i2.UserId and im.latestDOI = i2.DateOfInterview

还有其他选择,一些是标准的,另一些是特定于DB的。

答案 1 :(得分:0)

在抓取面试时重写使用OUTER APPLY,这样你可以使用order而不是MAX

select u.UserID, firstname, lastname, LatestInterviewDetails.ID, LatestInterviewDetails.DateOfInterview as latestDOI 
from users u 
OUTER APPLY (SELECT TOP 1 Id, DateOfInterview
    FROM interviews
    WHERE interviews.UserID = u.UserId
    ORDER BY interviews.DateOfInterview DESC
) as LatestInterviewDetails

注意:这表示您使用的是Microsoft SQL Server