MySQL 查詢連續登陸7天以上的用戶


  注意:本文使用的row_number()函數是MySql8.0版本才有,MySql5.7及以下是不存在此函數

  MySql8.0版本下載:https://downloads.mysql.com/archives/installer/

  查詢7天連續登陸用戶這個問題很經典,解決方法也有很多,這里我我參考另一位博友寫的,自己實踐了下,希望對大家有幫助。

具體思路:

1、因為每天用戶登錄次數可能不止一次,所以需要先將用戶每天的登錄日期去重。

2、再用row_number() over(partition by _ order by _)函數將用戶id分組,按照登陸時間進行排序。

3、計算登錄日期減去第二步驟得到的結果值,用戶連續登陸情況下,每次相減的結果都相同。

4、按照id和日期分組並統計人數,篩選大於等於7的即為連續7天登陸的用戶。

 

  • 實踐前准備:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for login_log
-- ----------------------------
DROP TABLE IF EXISTS `login_log`;
CREATE TABLE `login_log`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `stu_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `createtime` datetime(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of login_log
-- ----------------------------
INSERT INTO `login_log` VALUES (1, 'zhangsan', '2021-03-07 09:58:29.438123');
INSERT INTO `login_log` VALUES (2, 'zhangsan', '2021-03-03 09:58:29.438123');
INSERT INTO `login_log` VALUES (3, 'zhangsan', '2021-03-05 09:58:29.438123');
INSERT INTO `login_log` VALUES (4, 'zhangsan', '2021-03-01 09:58:29.438123');
INSERT INTO `login_log` VALUES (5, 'lisi', '2021-02-04 09:58:29.438123');
INSERT INTO `login_log` VALUES (6, 'lisi', '2021-02-03 09:58:29.438123');
INSERT INTO `login_log` VALUES (7, 'lisi', '2021-02-02 09:58:29.438123');
INSERT INTO `login_log` VALUES (8, 'lisi', '2021-02-01 09:58:29.438123');
INSERT INTO `login_log` VALUES (9, 'lisi', '2021-02-05 09:58:29.438123');
INSERT INTO `login_log` VALUES (10, 'lisi', '2021-02-06 09:58:29.438123');
INSERT INTO `login_log` VALUES (11, 'lisi', '2021-02-07 09:58:29.438123');
INSERT INTO `login_log` VALUES (12, 'lisi', '2021-02-08 09:58:29.438123');
INSERT INTO `login_log` VALUES (13, 'xiaowang', '2021-02-05 09:58:29.438123');
INSERT INTO `login_log` VALUES (14, 'xiaoli', '2021-02-06 09:58:29.438123');
INSERT INTO `login_log` VALUES (15, 'xiaoli', '2021-02-07 09:58:29.438123');
INSERT INTO `login_log` VALUES (16, 'xiaozhao', '2021-02-08 09:58:29.438123');
INSERT INTO `login_log` VALUES (17, 'lisi', '2021-02-05 09:58:29.438123');
INSERT INTO `login_log` VALUES (18, 'xiaozhao', '2021-02-06 09:58:29.438123');
INSERT INTO `login_log` VALUES (19, 'lisi', '2021-02-07 09:58:29.438123');

SET FOREIGN_KEY_CHECKS = 1;
  • 查詢表里面數據

  • 查詢近7天連續登錄sql語句

  8.0版本實現方式

-- 3 按照stu_name和日期分組並統計人數,篩選大於等於7的即為連續7天登陸的用戶
select  stu_name,count(num) num from 
(
    -- 2 計算登錄日期,登錄時間-用row_number() over(partition by _ order by _)函數將用戶id分組的結果值
    select stu_name,date(createtime)-row_number() over(partition by stu_name ORDER BY createtime) num from 
    (
    -- 1、去重,每天多次登錄,只保留一條
    select distinct stu_name,DATE_FORMAT(createtime,'%Y-%m-%d')createtime  from login_log
    ) t1
)t2 GROUP BY  stu_name  HAVING(count(1))>7

   5.7版本實現方式

-- 聲明用戶變量,記錄行號和登錄用戶名
set @row_number:=0,@customer_no:='';
-- 3 如果連續登錄,date(createtime)-num 結果會相等
select  stu_name,count( date(createtime)-num )as num from 
(
   -- 2 記錄行號;
   select    @row_number:=
            case 
                when @customer_no=l1.stu_name then @row_number+1
                else 1
            end as num,
      @customer_no:= l1.stu_name  stuName
   ,stu_name,DATE_FORMAT(createtime,'%Y-%m-%d') createtime from 
    (
      -- 1 去除同一天登錄多次
      select DISTINCT stu_name,DATE_FORMAT(createtime,'%Y-%m-%d') createtime from login_log  ORDER BY stu_name,createtime
    ) l1
  
) l2 GROUP BY l2.stu_name HAVING num>7

 

 

 

參考:https://www.cnblogs.com/ikww/p/12012831.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM