SQL嵌套插入查询

时间:2013-03-04 19:14:51

标签: php mysql insert

我今天拥有一个包含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

2 个答案:

答案 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)