[英]mysql join table and search for most recent record on where clause
我有两张桌子
下面只是向您展示了这两个表是如何相关的。 我想返回在 1565827199 之后过期的订阅,但它需要检查每个用户最近的订阅。
select
u.id
from users u
join subscriptions s on u.id s.userId
where s.currentPeriodEnd > 1565827199
ORDER BY u.lastName ASC
一个用户可能在订阅表中有多个订阅。 我需要做的是修改上面的查询,因此它会检查该用户的最新订阅,而不是它找到的第一个订阅。
select * from subscriptions ORDER BY currentPeriodEnd DESC LIMIT 1
我尝试了一些不同的东西(别名表、子查询),我在 stackoverflow 的其他地方没有任何运气。
您可以使用相关子查询进行过滤,如下所示:
select u.*, s.*
from users u
inner join subscriptions s on u.id = s.userId
where s.currentPeriodEnd = (
select max(s1.currentPeriodEnd)
from subscriptions s1
where s1.userId = u.id and s1.currentPeriodEnd > 1565827199
)
order by u.lastName
为了提高性能,请考虑subscriptions(userId, currentPeriodEnd)
。
或者,如果您正在运行 MySQL 8.0,您可以使用row_number()
:
select *
from (
select
u.*,
s.*,
row_number() over(partition by u.id order by s.currentPeriodEnd desc)
from users u
inner join subscriptions s on u.id = s.userId
where s.currentPeriodEnd > 1565827199
) t
where rn = 1
order by lastName
加入一个子查询,获取每个用户的最新时间,并将其过滤到指定时间戳之后的时间。
select u.id
from users u
join (
select userid
FROM subscriptions
GROUP BY userid
HAVING MAX(currentPeriodEnd) > 1565827199
) s ON s.userid = u.id
ORDER BY u.lastName ASC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.