+ -
当前位置:首页 → 问答吧 → 求解一条sql语句

求解一条sql语句

时间: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
表记录如上,id为自动递增,希望统计出,同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个id的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时
数据库mysql,版本5.1

作者: qq35610   发布时间: 2011-08-21

total 列为连续登录的天数,当然判断规则你要用准确的 24 小时来判断的话,用其它的函数即可:
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

表记录如上,id为自动递增,希望统计出,同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个userid的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时
数据库mysql,版本5.1

作者: qq35610   发布时间: 2011-08-21

引用 1 楼 nicenight 的回复:

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

引用 4 楼 acmain_chm 的回复:

建议你说明你期望的结果是什么样。


同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个userid的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时

作者: qq35610   发布时间: 2011-08-21

http://www.iteye.com/problems/70397,我已经无语了,看这个吧

作者: qq35610   发布时间: 2011-08-21

说明一下你希望这个SQL语句产生的结果是什么样?

楼主与其花这么多时间浪费,不如耐心参考一下这个。

  参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

作者: ACMAIN_CHM   发布时间: 2011-08-21

引用 7 楼 acmain_chm 的回复:

说明一下你希望这个SQL语句产生的结果是什么样?

楼主与其花这么多时间浪费,不如耐心参考一下这个。

参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html


说的已经很明白了,再看不懂的话,真没办法了

作者: qq35610   发布时间: 2011-08-21

再说一遍规则,同一个userid连续的数目的最大值,是否超过了7条,连续的规则是,同一个userid的情况下,上一条记录和下一条记录之间times字段的差值,不超过24小时,返回同一个userid连续的数目的最大值就行了

作者: qq35610   发布时间: 2011-08-21

只需要最大值

作者: qq35610   发布时间: 2011-08-21

针对你自己顶楼的测试数据,返回结果什么样才算正确?

作者: ACMAIN_CHM   发布时间: 2011-08-21

为什么一直不肯贴出来?

作者: ACMAIN_CHM   发布时间: 2011-08-21

引用 11 楼 acmain_chm 的回复:

针对你自己顶楼的测试数据,返回结果什么样才算正确?

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

提供一下你的create table / insert into 语句,这样别人可以直接使用你的数据进行测试。

作者: ACMAIN_CHM   发布时间: 2011-08-21

引用 11 楼 acmain_chm 的回复:

针对你自己顶楼的测试数据,返回结果什么样才算正确?


因为每次统计针对的只是单个用户,所以只有一个返回结果

作者: qq35610   发布时间: 2011-08-21

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- 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