从 MySQL 数据中获取连续 3 天

Posted

技术标签:

【中文标题】从 MySQL 数据中获取连续 3 天【英文标题】:Get 3 consecutive days from MySQL data 【发布时间】:2016-07-12 03:25:07 【问题描述】:

我正在尝试使用来自此 SO 问题 Check for x consecutive days - given timestamps in database 的查询来计算用户提交活动的连续天数,即 3 天、5 天、7 天等。

查询是:

SELECT IF(COUNT(1) > 0, 1, 0) AS has_consec
FROM
(
SELECT *
FROM
(
    SELECT IF(b.dateAdded IS NULL, @val:=@val+1, @val) AS consec_set
    FROM activity a
    CROSS JOIN (SELECT @val:=0) var_init
    LEFT JOIN activity b ON 
        a.userID = b.userID AND
        a.dateAdded = b.dateAdded + INTERVAL 1 DAY
    WHERE a.userID = 1
) a
GROUP BY a.consec_set
HAVING COUNT(1) >= 3
) a

当日期字段不是 dateTime 时,代码效果很好,但我如何修改代码以忽略 dateTime 的时间部分?我曾尝试使用 DATE(dateAdded) 但这不起作用。

我的数据如下:

userID  dateAdded
1       2016-07-01 17:01:56
1       2016-07-02 12:45:49
1       2016-07-03 13:06:27
1       2016-07-04 12:51:10
1       2016-07-05 15:51:10
2       2016-07-06 16:51:10
2       2016-07-07 11:51:10
1       2016-07-08 11:26:38

谢谢

【问题讨论】:

试试这个tutorialspoint.com/mysql/… 尝试像这样DATE(a.dateAdded) 将您的日期时间字段转换为日期 试过了,没用。如果我将时间组件更改为相同的查询,但即使转换为 DATE 也不会产生正确的结果。 你能分享一个 SQL FIDDLE 吗? 【参考方案1】:

dateAdded 字段转换为Date

请试一试,如果它解决了问题,请告诉我:

SELECT IF(COUNT(1) > 0, 1, 0) AS has_consec
FROM
(
SELECT *
FROM
(
    SELECT IF(b.dateAdded IS NULL, @val:=@val+1, @val) AS consec_set
    FROM activity a
    CROSS JOIN (SELECT @val:=0) var_init
    LEFT JOIN activity b ON 
        a.userID = b.userID AND
        DATE(a.dateAdded) = DATE(b.dateAdded) + INTERVAL 1 DAY
    WHERE a.userID = 1
) a
GROUP BY a.consec_set
HAVING COUNT(1) >= 3
) a;

注意:只有当 time (hh:mm:ss) 相同时,使用 timestamp 才会返回正确的输出

【讨论】:

以上是关于从 MySQL 数据中获取连续 3 天的主要内容,如果未能解决你的问题,请参考以下文章

flink sql 近3天登录次数

PHP 仅以登录形式从 MySQL DB 中获取最后一行

从数据库中获取但仅持续 30 天

laravel 实现每日签到及奖励功能

MySQL实现随机获取几条数据的方法

Mysql获取连续的15天的销售数据