mysql 不用开窗求连续3天登录
时间: 2023-05-27 08:02:31 浏览: 86
可以使用自连接和子查询实现:
```
SELECT DISTINCT t1.user_id
FROM log AS t1
INNER JOIN log AS t2 ON t2.user_id = t1.user_id AND t2.login_time BETWEEN DATE_ADD(t1.login_time, INTERVAL 1 DAY) AND DATE_ADD(t1.login_time, INTERVAL 2 DAY)
INNER JOIN log AS t3 ON t3.user_id = t1.user_id AND t3.login_time BETWEEN DATE_ADD(t1.login_time, INTERVAL 2 DAY) AND DATE_ADD(t1.login_time, INTERVAL 3 DAY)
```
这条查询首先将 log 表自连接三次,每个连接表示当前用户登录的三天,然后根据日期差值来关联这三个连接。这样,只有登录连续三天的用户会在结果集中出现。DISTINCT 用于去除重复的 user_id。
相关问题
mysql不用开窗写连续3天登录
假设有一个名为user_login_log的表,它包含以下字段:user_id, login_time。
可以使用自连接子查询和DATEDIFF函数来实现:
```
SELECT DISTINCT l1.user_id
FROM user_login_log l1
WHERE EXISTS (
SELECT 1 FROM user_login_log l2
WHERE l2.user_id = l1.user_id
AND l2.login_time > l1.login_time
AND DATEDIFF(l2.login_time, l1.login_time) = 1
) AND EXISTS (
SELECT 1 FROM user_login_log l3
WHERE l3.user_id = l1.user_id
AND l3.login_time > l1.login_time
AND DATEDIFF(l3.login_time, l1.login_time) = 2
)
```
这将返回所有连续登录了连续3天的用户ID。在子查询中,我们使用连续的两个登录记录之间的日期差异检查它们是否连续。注意,我们将DISTINCT用于防止返回重复的用户ID。
mysql不用开窗写连续3天购买
可以使用INNER JOIN连续3天购买的情况,示例代码如下:
SELECT t1.user_id, t1.buy_date, t2.buy_date, t3.buy_date
FROM orders t1
INNER JOIN orders t2 ON t1.user_id = t2.user_id AND t1.buy_date = DATE_SUB(t2.buy_date, INTERVAL 1 DAY)
INNER JOIN orders t3 ON t2.user_id = t3.user_id AND t2.buy_date = DATE_SUB(t3.buy_date, INTERVAL 1 DAY)
WHERE t1.buy_date BETWEEN '2022-01-01' AND '2022-01-31'
AND t1.total_amount > 0 AND t2.total_amount > 0 AND t3.total_amount > 0
ORDER BY t1.user_id, t1.buy_date;
该查询会返回连续购买3天以上的用户ID,以及每个用户连续购买3天的日期。其中,t1表示订单表,t2表示与t1相连的同一个用户的订单表,t3表示与t2相连的同一个用户的订单表。使用INNER JOIN语句来连续三天购买情况的判断。