使用MAX查找正确的记录(日期)

时间:2011-07-22 10:41:08

标签: mysql

我遇到了这个问题,我现在已经挣扎了一段时间,阅读了很多帖子,但却无法通过自己解决这个问题。

我有一张表,记录了俱乐部成员身份变化的记录。 “Status_Members”

MemberID     Date       StatusID

23         2011-04-01      1
46         2011-05-01      2
23         2011-10-01      2
46         2011-06-01      1

它连接到一个表“Status_Type”,其中包含StatusID的值。

StatusID     StatusName
1             Active
2             Passive

将2加在一起得到:

MemberID     Date       StatusName
23         2011-04-01      Active
46         2011-05-01      Passive
23         2011-10-01      Passive
46         2011-06-01      Active

现在我希望能够在特定日期找到成员的状态。

让我们说2011-07-01。

所以我尝试了这段代码:

SELECT S.MemberID, MAX(Date), ST.StatusName FROM Status_Members S, Status_Type ST
WHERE ST.StatusId=S.StatusID
AND
Date <= '2011-07-01'
Group By MemberID
Order by Date DESC

所以我希望结果是:

MemberID, MAX(Date), StatusName

46       2011-06-01   Active
23       2011-04-01   Active

但我得到了这个“错误”的结果

MemberID, MAX(Date), StatusName

46       2011-06-01   Passive
23       2011-04-01   Active

为什么我在MemberID 46上获得结果Passive而不是Active???

任何人都可以帮我吗???

最好的关注一个新手

3 个答案:

答案 0 :(得分:2)

当您与MAX进行汇总时,您无法控制未获得聚合或收集的代表行,即您的状态ID。所以做两个查询并加入它们:

SELECT sm.MemberID AS MemberId, MaxDate, StatusName
FROM Status_Type AS st
JOIN Status_Members AS sm ON (st.StatusId = sm.StatusId)
JOIN (SELECT MemberID, MAX(Date) AS MaxDate FROM Status_Members WHERE Date <= xxx GROUP BY MemberID) AS sq
  ON (sm.MemberId = sq.MemberId AND sm.Date = sq.MaxDate);

子查询生成一个中间表MemberId, MaxDate,我们再次将Member_Status表再次加入,以检索该日期的状态。

答案 1 :(得分:0)

在您的查询中,您GROUP BY member.id。因此,您的MAX()函数返回给定成员的MAX日期,462011-06-01。它不应该返回ST.StatusName,因为它不是聚合函数或GROUP BY的一部分,所以我猜它只是第一次出现。

答案 2 :(得分:0)

您是否尝试过GROUP BY statusName?

SELECT S.MemberID, MAX(Date) as maxDate, ST.StatusName FROM Status_Members S, Status_Type ST
WHERE ST.StatusId=S.StatusID
GROUP BY MemberID, StatusName
HAVING maxDate <= '2011-07-01'
ORDER By Date DESC