1

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

2 回答 2

1

I think you should do this all with one query, that returns the key and the information you want:

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

To the extent possible, you should let the database do the "iterations" and just read back the resulting data.

In response to your comment. If you have a list of keys in $VALUE, then you could do:

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

Or, if you are generating the query, you can put the list in an in clause. So, the where could look like:

where key in (2, 3, 4, 5)
于 2013-03-04T19:21:54.713 回答
1

尝试:

select key, pass, count(*) from testcase group by key, pass

上的索引pass将毫无用处。上的索引key,这应该会有所帮助。但是基数为 4-10,嗯,不会很有帮助。

于 2013-03-04T19:18:24.253 回答