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子句的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQL Where 子句

搜索带有单引号的 where 子句的记录

lambda 表达式使用 select 和 where 子句连接多个表

OUTER JOIN 结果缺少行,没有 WHERE 子句(找到解决方法)

在 from 子句或 where 子句中进行 equi join 是不是更好

MySQL