Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL查询中使用SUM和IF时,值计数错误_Mysql_If Statement_Count_Sum - Fatal编程技术网

在MySQL查询中使用SUM和IF时,值计数错误

在MySQL查询中使用SUM和IF时,值计数错误,mysql,if-statement,count,sum,Mysql,If Statement,Count,Sum,当将IF函数与sum结合使用时,我的数据库查询中存在计数问题 具有相同行为的示例数据库: CREATE TABLE `test` ( `id` int(11) NOT NULL, `system` varchar(11) NOT NULL, `status` varchar(11) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=ut

当将IF函数与sum结合使用时,我的数据库查询中存在计数问题

具有相同行为的示例数据库:

CREATE TABLE `test` (
 `id` int(11) NOT NULL,
  `system` varchar(11) NOT NULL,
  `status` varchar(11) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
示例数据:

INSERT INTO `test` (`id`, `system`, `status`, `timestamp`) VALUES
(3, 'systema', 'ok', '2017-03-25 06:43:03'),
(4, 'systema', 'ok', '2017-03-25 06:43:09'),
(5, 'systema', 'fail', '2017-03-25 06:43:16'),
(6, 'systema', 'ok', '2017-03-25 06:43:22'),
(7, 'systema', 'ok', '2017-03-25 06:43:31'),
(8, 'systema', 'fail', '2017-03-25 07:12:28'),
(9, 'systema', 'fail', '2017-03-25 07:13:07'),
(10, 'systema', 'ok', '2017-03-25 07:13:13'),
(11, 'systema', 'ok', '2017-03-25 07:26:21'),
(12, 'systema', 'fail', '2017-03-25 07:26:41'),
(13, 'systema', 'fail', '2017-03-25 07:28:52'),
(14, 'systema', 'fail', '2017-03-25 07:29:13'),
(15, 'systema', 'fail', '2017-03-25 07:29:39');
确保所有变量均为空:

mysql> set @prev_system:=null;
Query OK, 0 rows affected (0.00 sec)

mysql> set @prev_status:=null;
Query OK, 0 rows affected (0.00 sec)

mysql> set @prev_time:=null;
Query OK, 0 rows affected (0.00 sec)
现在,我们进行数据库查询,不进行计数:

mysql> select @prev_system as old_system, @prev_status as old_status, @prev_time 
as old_time, if (@prev_status <> status and @prev_system = system and @prev_time 
< timestamp,1,NULL) as hops, @prev_system:=system as system, @prev_status:=status as 
status, @prev_time:=timestamp as timestamp from test;
与旧状态相比,状态已更改时,列中的“跃点”应为“1”,如果未发生更改,则应为“NULL”,到目前为止,情况良好

但是,当我将SUM语句添加到IF语句时,在hops列中没有得到预期的“5”作为exprected结果:

查询:

mysql> select @prev_system as old_system, @prev_status as old_status, @prev_time 
as old_time, sum(if (@prev_status <> status and @prev_system = system and @prev_time < timestamp,1,NULL)) as hops, @prev_system:=system as system, 
@prev_status:=status as status, @prev_time:=timestamp as timestamp from test;
我想我错过了一件很小的事情,谁能帮我把总数算对呢


谢谢

您没有以任何方式对它们进行排序,它们可能以任何顺序出现,这可能会影响到某些内容。我忘了添加它们,但这对结果没有影响,我按系统添加了顺序,在查询末尾添加了时间戳,结果和输出是相同的,结果仍然是“7”,正如您在前面的输出中所看到的,dataorder似乎没有问题,但是结果是出乎意料的是,后一种顺序并不重要,因为只有一行。你可能需要一个子查询。我正试图阻止子查询,因为真实的数据集非常大,而且在增长,而且子查询速度很慢。我希望任何人都能帮助我找到一个解决方案,因为我对这种增强型mysql没有太多经验。谢谢你,萨米。
mysql> select @prev_system as old_system, @prev_status as old_status, @prev_time 
as old_time, sum(if (@prev_status <> status and @prev_system = system and @prev_time < timestamp,1,NULL)) as hops, @prev_system:=system as system, 
@prev_status:=status as status, @prev_time:=timestamp as timestamp from test;
+------------+------------+----------+------+---------+--------+---------------------+
| old_system | old_status | old_time | hops | system  | status | timestamp           |
+------------+------------+----------+------+---------+--------+---------------------+
| NULL       | NULL       | NULL     |    7 | systema | ok     | 2017-03-25 07:43:03 |
+------------+------------+----------+------+---------+--------+---------------------+