我今天拥有一个包含3个查询的数据库,用于测试用例中的统计信息。我使用php来构建一个网站,但查询执行时间太长,所以我无法显示完整的网站统计信息,因为我不想这样做。因为现在数据库很少分批更新,所以我可以为此目的每天/每周制作更新数据库的事件。
我今天有以下3个查询来显示我想要的信息:
SELECT key FROM testcase GROUP BY key;
这给了我一个包含4-10组测试的int的列表。说1,2,3,4对于论证的情况。 然后我在子查询中将其作为键进行迭代,以获得传递的测试数量和未通过以下2个查询传递的测试数量:
SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;
和
SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;
这就是今天的工作方式。每个密钥的查询大约需要25-30秒,这会使站点超时。 (%value%是来自for循环的当前值的伪代码)
相反,我想到了一个sql查询,它将这个添加到数据库表中,该数据库表包含每天/每周填充的密钥,通过,失败表,以便在网站上显示为统计信息。我已经看到了一些你可以用子查询迭代的情况,但由于2个执行的查询是对立的,我看不到任何解决方案。
我尝试将查询中使用的值编入索引但没有成功(也可能是错误的)。
// Andreas(SQL新手)
修改
哦,困境,在哪里设置解决方案,我制作了一个来自Gordon和Joe的组合来制作最有效的查询:
INSERT INTO statistics (key,passed,failed)
SELECT
key,
SUM(case when T.pass = 1 then T.matches else 0 end) as passed,
SUM(case when T.pass = 0 then T.matches else 0 end) as failed
FROM
(SELECT
key,pass,COUNT(*) AS matches
FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
GROUP BY key,pass)T
GROUP BY key
答案 0 :(得分:1)
尝试:
select key, pass, count(*) from testcase group by key, pass
pass
上的索引将毫无用处。 key
上的索引,这应该有所帮助。但是基数为4-10,嗯,不会超级有用。
答案 1 :(得分:1)
我认为您应该使用一个查询完成所有操作,该查询返回您想要的密钥和信息:
select key,
SUM(case when pass = 1 AND key = %value% then 1 else 0 end) as passed,
SUM(case when pass = 0 AND key = %value% then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
group by key
在可能的情况下,您应该让数据库执行“迭代”,然后回读结果数据。
回应你的评论。如果您有$ VALUE中的键列表,那么您可以这样做:
insert into statistics(key, pass, fail)
select key,
SUM(case when pass = 1 then 1 else 0 end) as passed,
SUM(case when pass = 0 then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
where concat(',', $VALUE, ',') like concat('%', key, '%')
group by key
或者,如果要生成查询,可以将列表放在in
子句中。因此,where
可能如下所示:
where key in (2, 3, 4, 5)