一个表格为Users
,其中包含id
和email
列。
另一个表格Payments
包含id
,created_at
,user_id
和foo
列。
User
有很多Payments
。
我需要一个查询,返回每个用户的email
,他的上一个payment
日期和最后一笔付款的foo
值。我怎么做?我现在拥有的是:
SELECT users.email, MAX(payments.created_at), payments.foo
FROM users
JOIN payments ON payments.user_id = users.id
GROUP BY users.id
这是错误的,因为foo
值不一定属于用户最近的付款。
答案 0 :(得分:1)
试试这个:
select users.email,foo,create_at
from users
left join(
select a.* from payments a
inner join (
select id,user_id,max(create_at)
from payments
group by id,user_id
)b on a.id = b.id
) payments on users.id = payments.user_id
如果用户尚未付款,则foo和create_at将返回NULL。如果您要排除没有付款的用户,请使用INNER JOIN。
答案 1 :(得分:0)
一种方法是使用MySQL版本的排名而不是分区,然后只选择rank = 1的那些行:
select tt.email,tt.created_at,tt.foo from (
select t.*,
case when @cur_id = t.id then @r:=@r+1 else @r:=1 end as rank,
@cur_id := t.id
from (
SELECT users.id,users.email, payments.created_at, payments.foo
FROM users
JOIN payments ON payments.user_id = users.id
order by users.id asc,payments.created_at desc
) t
JOIN (select @cur_id:=-1,@r:=0) r
) tt
where tt.rank =1;
这样可以节省两次payments
表。可能会慢一些。取决于您的数据!