繁体   English   中英

mysql 连接表并在 where 子句中搜索最新记录

[英]mysql join table and search for most recent record on where clause

我有两张桌子

  • 用户:id,email,名字,姓氏
  • 订阅:id、userId、currentPeriodStart、currentPeriodEnd

下面只是向您展示了这两个表是如何相关的。 我想返回在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM