以下查询中的计数应为 3 和 1。计数应该是连续获得的积分。因此,一旦用户未能获得任何积分,计数就会重新开始。
mysql> select name, count(*) from sortest group by name, (points = 0) OR (points is NULL) having name= 'john';
+------+----------+
| name | count(*) |
+------+----------+
| john | 4 |
| john | 2 |
+------+----------+
2 rows in set (0.00 sec)
mysql> select * from sortest;
+----+------+--------+
| id | name | points |
+----+------+--------+
| 1 | john | 12 |
| 2 | john | 23 |
| 3 | john | 43 |
| 4 | hari | NULL |
| 5 | hari | 56 |
| 6 | john | NULL |
| 7 | hari | 0 |
| 8 | john | 44 |
| 9 | john | 0 |
| 10 | hari | 43 |
| 11 | hari | 44 |
| 12 | hari | 78 |
| 13 | hari | 0 |
+----+------+--------+
13 rows in set (0.00 sec)
mysql> show create table sortest\G
*************************** 1. row ***************************
Table: sortest
Create Table: CREATE TABLE `sortest` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
`points` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
在本例中,约翰的计数应为 5、1 和 2
5 和 1 因为它以 0 或 NULL 结尾,2 因为它尚未以 0 或 NULL 结束
mysql> select * from sortest;
+----+------+--------+
| id | name | points |
+----+------+--------+
| 1 | john | 12 |
| 2 | john | 23 |
| 3 | john | 43 |
| 4 | hari | NULL |
| 5 | hari | 56 |
| 6 | john | NULL |
| 7 | hari | 0 |
| 8 | john | 44 |
| 9 | john | 0 |
| 10 | hari | 43 |
| 11 | hari | 44 |
| 12 | hari | 78 |
| 13 | hari | 0 |
| 14 | john | 55 |
| 15 | john | 95 |
+----+------+--------+
15 rows in set (0.00 sec)
mysql> select name, count(*) from sortest group by name, (points = 0) OR (points is NULL) having name= 'john';
+------+----------+
| name | count(*) |
+------+----------+
| john | 6 |
| john | 2 |
+------+----------+
2 rows in set (0.00 sec)
最佳答案
为什么计数应该是 3 和 1?您的查询分组依据:
- 姓名
- (点数 = 0 或点数为 NULL)
有两行,其中name=john
和(points = 0 OR point IS NULL)
,并且有四 其他行,其中 name=john
.
因此,您的查询正如您所描述的那样工作。您最终想要实现什么目标?
关于mysql - 连续非空值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1321670/