2015-07-20 29 views
0

我有一个“成员”表是这样的:整蛊GROUP BY SQL与附加约束

id status user_id created_at 
----------------------------------- 
1 active 1   2015-07-01 
2 active 2   2015-07-01 
3 inactive 1   2015-07-04 
4 deleted 2   2015-07-04 
5 active 3   2015-07-04 
6 active 1   2015-07-08 
7 inactive 3   2015-07-08 

怎么可能在任何给定日期查询所有用户的最新状态?

对于2015年7月1日输出应为:

id status user_id created_at 
----------------------------------- 
1 active 1   2015-07-01 
2 active 2   2015-07-01 

对于2015年7月5日输出应为:

id status user_id created_at 
----------------------------------- 
3 inactive 1   2015-07-04 
4 deleted 2   2015-07-04 
5 active 3   2015-07-04 

对于2015-07- 10输出应该是:

id status user_id created_at 
----------------------------------- 
3 active 1   2015-07-08 
4 deleted 2   2015-07-04 
5 inactive 3   2015-07-08 

非常感谢任何帮助!

回答

1

使用group bywhere指定日期前得到最新的日期,然后加入:

select m.* 
from members m join 
    (select user_id, max(created_at) as maxca 
     from members 
     where created_at <= '2015-07-08' -- or whatever 
     group by user_id 
    ) mu 
    on m.user_id = mu.user_id and m.created_at = mu.maxca; 
+0

这只能返回一行,并不适用于所有的行user_id说明 – santacruz

+0

@santacruz。 。 。这应该为每个用户ID返回一行。设置一个SQL小提琴,所以我可以看到你在做什么。 –

+0

对不起,@gordon。你是对的,它的工作原理! http://sqlfiddle.com/#!9/b362b/2 – santacruz