求解一条sql语句
时间:2011-08-21
来源:互联网
1 1 2011-8-1 14:59:59
2 1 2011-8-2 14:58:59
3 1 2011-8-3 14:57:59
4 1 2011-8-4 14:56:59
5 1 2011-8-6 14:55:59
6 1 2011-8-7 14:54:59
7 2 2011-8-6 14:55:59
8 2 2011-8-7 14:54:59
表记录如上,id为自动递增,希望统计出,同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个id的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时
数据库mysql,版本5.1
作者: qq35610 发布时间: 2011-08-21
SQL code
mysql> select * from tb4; +------+-------------------+ | id | loginTime | +------+-------------------+ | 1 | 2011-8-1 14:59:59 | | 2 | 2011-8-2 14:58:59 | | 3 | 2011-8-3 14:57:59 | | 4 | 2011-8-4 14:56:59 | | 5 | 2011-8-6 14:55:59 | | 6 | 2011-8-7 14:54:59 | +------+-------------------+ 6 rows in set (0.00 sec) mysql> set @last := 0; Query OK, 0 rows affected (0.00 sec) mysql> set @days := 1; Query OK, 0 rows affected (0.00 sec) mysql> select ifnull(@last, @days := @days + 1), if(dayofyear(loginTime) - dayo fyear(@last) = 1, @days := @days + 1, @days := 1) as 'total', @last := loginTime -> from tb4; +-----------------------------------+-------+--------------------+ | ifnull(@last, @days := @days + 1) | total | @last := loginTime | +-----------------------------------+-------+--------------------+ | 0 | 1 | 2011-8-1 14:59:59 | | 2011 | 2 | 2011-8-2 14:58:59 | | 2011 | 3 | 2011-8-3 14:57:59 | | 2011 | 4 | 2011-8-4 14:56:59 | | 2011 | 1 | 2011-8-6 14:55:59 | | 2011 | 2 | 2011-8-7 14:54:59 | +-----------------------------------+-------+--------------------+ 6 rows in set, 1 warning (0.00 sec) mysql>
作者: nicenight 发布时间: 2011-08-21
数据库mysql,版本5.1
作者: qq35610 发布时间: 2011-08-21
total 列为连续登录的天数,当然判断规则你要用准确的 24 小时来判断的话,用其它的函数即可:
SQL code
mysql> select * from tb4;
+------+-------------------+
| id | loginTime |
+------+-------------------+
| 1 | 2011-8-1 14:59:5……
这个考虑到了针对相同userid的符合条件的数目的判断吗?
作者: qq35610 发布时间: 2011-08-21
作者: ACMAIN_CHM 发布时间: 2011-08-21
建议你说明你期望的结果是什么样。
同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个userid的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时
作者: qq35610 发布时间: 2011-08-21
作者: qq35610 发布时间: 2011-08-21
楼主与其花这么多时间浪费,不如耐心参考一下这个。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
作者: ACMAIN_CHM 发布时间: 2011-08-21
说明一下你希望这个SQL语句产生的结果是什么样?
楼主与其花这么多时间浪费,不如耐心参考一下这个。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
说的已经很明白了,再看不懂的话,真没办法了
作者: qq35610 发布时间: 2011-08-21
作者: qq35610 发布时间: 2011-08-21
作者: qq35610 发布时间: 2011-08-21
作者: ACMAIN_CHM 发布时间: 2011-08-21
作者: ACMAIN_CHM 发布时间: 2011-08-21
针对你自己顶楼的测试数据,返回结果什么样才算正确?
id userid times
1 1 2011-8-1 14:59:59
2 1 2011-8-2 14:58:59
3 1 2011-8-3 14:57:59
4 1 2011-8-4 14:56:59
5 1 2011-8-6 14:55:59
6 1 2011-8-7 14:54:59
7 2 2011-8-6 14:55:59
8 2 2011-8-7 14:54:59
针对上面的数据,最大的连续记录数,应该是
1 1 2011-8-1 14:59:59
2 1 2011-8-2 14:58:59
3 1 2011-8-3 14:57:59
4 1 2011-8-4 14:56:59
这四条,所以返回的值应该是4
作者: qq35610 发布时间: 2011-08-21
作者: ACMAIN_CHM 发布时间: 2011-08-21
针对你自己顶楼的测试数据,返回结果什么样才算正确?
因为每次统计针对的只是单个用户,所以只有一个返回结果
作者: qq35610 发布时间: 2011-08-21
-- ----------------------------
-- Table structure for `t`
-- ----------------------------
DROP TABLE IF EXISTS `t`;
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) NOT NULL,
`logintime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of t
-- ----------------------------
INSERT INTO `t` VALUES ('1', '1', '2011-08-01 14:59:59');
INSERT INTO `t` VALUES ('2', '1', '2011-08-02 14:58:59');
INSERT INTO `t` VALUES ('3', '1', '2011-08-03 14:57:59');
INSERT INTO `t` VALUES ('4', '1', '2011-08-04 14:56:59');
INSERT INTO `t` VALUES ('5', '1', '2011-08-06 14:55:59');
INSERT INTO `t` VALUES ('6', '1', '2011-08-07 14:54:59');
作者: qq35610 发布时间: 2011-08-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28