我今天有一个数据库,其中包含 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