mysql獲取連續登陸大於等於3天的用戶id

建表

CREATE TABLE `user_login` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL DEFAULT '0',
  `login_date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

插入數據

INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (1, 1, '2020-5-13');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (2, 1, '2020-5-15');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (3, 1, '2020-5-14');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (4, 1, '2020-5-17');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (5, 2, '2020-5-15');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (6, 3, '2020-5-14');
INSERT INTO `user_login` (`id`, `user_id`, `login_date`) VALUES (7, 3, '2020-5-17');

查詢

按用戶id和login_date排序,添加rank(分組內行號)輔助列,生成中間表

create TABLE mysql_group_by as SELECT * from (
SELECT *, @rank := case when @current_id <> user_id then 1 else @rank+1 end as rank, @current_id:=user_id as cur
from user_login order by user_id, login_date
) as a

按用戶id和login_date減去rank(連續的話差值一樣)分組,獲取次數大於等於3的用戶id

SELECT user_id, DATE_SUB(t.login_date,INTERVAL t.rank DAY), count(1) cnt from mysql_group_by t
GROUP BY user_id, DATE_SUB(t.login_date,INTERVAL t.rank DAY) HAVING count(1) >=3;

不使用中間表的語句:

SELECT t.user_id, DATE_SUB(t.login_date,INTERVAL t.rank DAY), count(1) cnt from 
(
SELECT *, @rank := case when @current_id <> user_id then 1 else @rank+1 end as rank, @current_id:=user_id as cur
from user_login order by user_id, login_date
) t
GROUP BY t.user_id, DATE_SUB(t.login_date,INTERVAL t.rank DAY) HAVING count(1) >=3;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章