使用belongs_to / has_many关系查询两个表

时间:2015-10-07 12:34:53

标签: mysql sql

一个表格为Users,其中包含idemail列。

另一个表格Payments包含idcreated_atuser_idfoo列。

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值不一定属于用户最近的付款。

2 个答案:

答案 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表。可能会慢一些。取决于您的数据!