2013-03-04 196 views
1

我今天有一个包含3个查询统计信息的数据库。我使用PHP来建立一个网站,但查询需要很长的时间来执行,所以我不能显示完整的网站统计数据,因为我不想做。因为现在数据库很少分批更新,所以我可以为此目的每天/每周更新数据库。SQL嵌套插入查询

我有以下3个查询今天显示我想要的信息:

SELECT key FROM testcase GROUP BY key; 

这让我从4-10组测试与诠释列表。争论的情况下说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个执行的查询是相反的,我看不到任何解决方案。

我试图索引我在查询中使用的值没有成功(这可能是错误的)。

//安德烈亚斯(SQL新手)

编辑:

哦困境,在哪里设置的解决方案,我从戈登和乔相结合,使这工作就像一个最快的查询魅力:

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 

回答

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 

在一定程度上,你应该让数据库做“迭代”和刚才读返回结果数据。

回复您的评论。如果您在$值键列表,那么你可以做:

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) 
+0

是否有可能使用sql查询插入%value%插槽中的密钥?我正在思考沿着INSERT的行进入statistcis(键,通过,失败),然后是该查询。 – Andreas 2013-03-04 19:50:47

+0

嗯,第二个看起来很有前途,但是我在phpMyAdmin中超时,明天会尝试使用mysqlquerybrowser和直接访问工作。在(SELECT键FROM FROM testcase GROUP BY键)_中添加查询_where键并尝试执行该操作。 – Andreas 2013-03-04 20:28:16

1

尝试:

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

pass上的索引将无济于事。索引key,这应该有所帮助。但是以4-10的基数,meh,不会超级有用。

+0

工作得很好得到的名单,从统计表格中插入它仍然一步。我会看看是否可以使用此查询获得更好的反馈,并在php中进行迭代。 – Andreas 2013-03-04 20:30:24