考虑到刚刚发生的那件事,我想要一些记录.在这种情况下,我们有一些用户,我们需要他们之前在2018年创建的订阅.

我们有这个订阅表:

id user_id created_at
1 1 2016-01-01
2 1 2017-01-01
3 1 2018-01-01
4 1 2019-01-01
5 1 2020-01-01
6 2 2018-01-01
7 2 2019-01-01

我使用的是自连接:

SELECT `subscriptions`.`id`
FROM `subscriptions`
LEFT JOIN subscriptions as previous 
    ON subscriptions.user_id = previous.user_id AND subscriptions.created_at > previous.created_at
WHERE `previous`.`created_at` BETWEEN '2018-01-01' AND '2018-12-31';

它返回4,5,7,但我只想要紧随其后的4,7

SQLFiddle

推荐答案

在MySQL 8+上,我们可以在这里使用LAG()分析函数:

WITH cte AS (
    SELECT *, LAG(created_at) OVER (PARTITION BY user_id
                                    ORDER BY created_at) lag_created_at
    FROM subscriptions
)

SELECT id, user_id, created_at
FROM cte
WHERE YEAR(lag_created_at) = 2018;

Mysql相关问答推荐

如何将MySQL与AS&Quot;语法一起用于存储过程返回的表?

SQL计算不同的列并返回所有行

当日期附加到MySQL后,如何按日期说明排序?

提高bash脚本从大型gml文件读取数据的效率

在MySQL的join查询中进行计算

排序子查询结果并返回每个 ID 的第一行

sequelize 中最好的更新方法是什么

基于关系的每个实体有一个真值和多个假值

如何让连续 3 周或以上的用户有订单?

mysql insert into select join - 通过连接表将值从一列复制到另一表

使用另一个表中的值更新一个表中的值

使用数据表的直方图(SQL 查询)

mySQL 中的主数据库和 IF 错误?

如何在考虑另一表的值的情况下计算一列的值

我在查询中没有得到正确的结果

是否可以从 .SQL 文件中计算表中的行数?

If else on WHERE 子句

MySQL时区更改?

MySQL与空值比较

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源