采用mysql 5.6
业务需求:
1、管理员上传视频,然后用户进行视频观看,统计用户点击视频的次数,进行日排行排序
表设计:
CREATE TABLE `v_video_play_log` (
`id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'id',
`VideoId` bigint(20) DEFAULT NULL COMMENT '视频id',
`memberId` bigint(20) DEFAULT NULL COMMENT '会员id',
`ip` varchar(128) DEFAULT NULL COMMENT '观看人ip',
`lookTime` datetime DEFAULT NULL COMMENT '点击观看时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='视频点播记录表';
插入模拟数据:
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('1', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('2', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('3', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('4', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('5', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('6', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:25:25');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('7', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:26:04');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('8', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:29:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('9', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('11', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:31:11');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('12', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:31:14');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('13', '3', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:31:49');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('20', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-21 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('21', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-26 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000057990010', '1', '12001002', '0:0:0:0:0:0:0:1', '2017-12-20 11:14:59');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058690001', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 13:41:25');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700000', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 13:54:23');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700001', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:14:27');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700002', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:14:31');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700003', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:14:35');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700004', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:14:38');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700005', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:14:42');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700006', '1', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:04');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700007', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:22');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700008', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:26');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700009', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:28');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700010', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:32');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058700011', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 14:15:35');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058720000', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:25:25');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058720002', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:26:04');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058730000', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-23 17:29:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740000', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740002', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740004', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740006', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740007', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-11-01 17:31:06');
INSERT INTO `video_gz_wmh`.`v_video_play_log` (`id`, `VideoId`, `memberId`, `ip`, `lookTime`) VALUES ('10000058740008', '2', '12001004', '0:0:0:0:0:0:0:1', '2017-12-20 17:31:06');
sql实现:
-- 总查询括号出来,方便order by 排序
SELECT *
FROM (
SELECT
-- 通过case方法判断,变量日期@pre_lookTime,是否等于上一个日期,一样的话,则数字序号加1,不一样,则需要从1开始
@i :=
CASE
WHEN
@pre_lookTime = a.lookTime
THEN
-- 通过case嵌套方法判断,变量点击数@pre_num,是否等于上一个点击数,一样的话,则并列排名,不一样,则数字序号加1
CASE
WHEN @pre_num = a.clickNum
THEN @i
ELSE @i + 1
END
ELSE 1
END AS rownum,
-- 将变量@pre_lookTime 等于上一条数据日期(即,根据sql查询的顺序赋值,变量等于当条数据的值,在下一条数据时,就等于上条数据的值)
@pre_lookTime := a.lookTime AS prelookTime,
-- 将变量@pre_lookTime 等于上一条数据号码
@pre_num := a.clickNum AS preclickNum,
a.*
FROM (
-- 将时间转换成yyyymmdd格式,进行分组排序,按日期排序
SELECT COUNT(lo.id) AS clickNum, lo.id, lo.VideoId, lo.memberId, lo.ip
, looklo.lookTime
FROM v_video_play_log lo, (SELECT DATE_FORMAT(lookTime, '%Y%m%d') AS lookTime, id
FROM v_video_play_log
) looklo
WHERE lo.id = looklo.id
GROUP BY looklo.lookTime, VideoId
ORDER BY looklo.lookTime DESC, COUNT(lo.id) DESC
) a,
-- 查询一个变量@i,赋值0,变量@pre_lookTime,赋值null,变量 @pre_num ,赋值0
(SELECT @i := 0, @pre_lookTime := NULL, @pre_num := 0
) b
) c
ORDER BY looktime DESC;
sql添加序号参考文章:https://www.cnblogs.com/CharlieLau/p/6737243.html,感谢大神