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

Mysql 使用MAX(日期)查找正确的记录,mysql,Mysql,我遇到了这个问题,我已经挣扎了一段时间了,读了很多帖子,但我自己却无法解决它 我有一张记录俱乐部会员身份变化的桌子。会员的地位 MemberID Date StatusID 23 2011-04-01 1 46 2011-05-01 2 23 2011-10-01 2 46 2011-06-01 1 这与保存StatusID值的表Status_类型相关联 StatusI

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

我有一张记录俱乐部会员身份变化的桌子。会员的地位

MemberID     Date       StatusID

23         2011-04-01      1
46         2011-05-01      2
23         2011-10-01      2
46         2011-06-01      1
这与保存StatusID值的表Status_类型相关联

StatusID     StatusName
1             Active
2             Passive
将这两种方法结合在一起可以得到:

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   Passive
23       2011-04-01   Active
为什么我在MemberID 46上得到的结果是被动的而不是主动的

有人能帮我吗

最好考虑一个新手

在您的查询中,您可以按member.id分组。因此,MAX函数返回给定成员的最大日期,46的最大日期为2011-06-01。它不应该返回ST.StatusName,因为它不是聚合函数或您的分组依据的一部分,所以我猜它只是第一次出现。

您是否也尝试过按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
当您使用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\u Status表中,以检索该日期的状态。

请看这篇文章,这很好用。非常感谢你,我现在明白为什么它不起作用了。谢谢你对这个问题的好解释。
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);