mysql连接表并搜索where子句的最新记录
Posted
技术标签:
【中文标题】mysql连接表并搜索where子句的最新记录【英文标题】:mysql join table and search for most recent record on where clause 【发布时间】:2020-07-31 11:23:31 【问题描述】:我有两张桌子
用户:ID、电子邮件、名字、姓氏 订阅: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
我已经尝试了一些不同的东西(别名表、子查询),但我在 *** 的其他地方没有任何运气。
【问题讨论】:
【参考方案1】:加入一个子查询,获取每个用户的最新时间,并将其过滤到指定时间戳之后的时间。
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
【讨论】:
【参考方案2】:您可以使用相关子查询进行过滤,如下所示:
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
【讨论】:
以上是关于mysql连接表并搜索where子句的最新记录的主要内容,如果未能解决你的问题,请参考以下文章
lambda 表达式使用 select 和 where 子句连接多个表
OUTER JOIN 结果缺少行,没有 WHERE 子句(找到解决方法)