首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL嵌套插入查询

SQL嵌套插入查询
EN

Stack Overflow用户
提问于 2013-03-04 19:14:51
回答 2查看 559关注 0票数 1

今天,我有了一个数据库,其中包含3个测试案例中的统计数据查询。我使用php来构建一个网站,但是查询执行起来太长了,所以我不能像我不想做的那样显示完整的站点统计数据。由于现在数据库很少成批更新,因此我可以使事件每天/每周更新数据库。

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

代码语言:javascript
运行
复制
SELECT key FROM testcase GROUP BY key;

这给了我一个包含4-10组测试的int的列表。比如说,1,2,3,4的论点。然后,我在子查询中将其作为关键字进行迭代,以获得通过测试的次数和未通过的测试数,并使用以下2个查询:

代码语言:javascript
运行
复制
SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON 
  testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;

代码语言:javascript
运行
复制
SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON 
  testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;

这就是今天的工作方式。每个键的查询时间大约为25-30秒,这使得站点超时。(%值%是for循环中当前值的伪代码)

相反,我想到了一个sql查询,它将其添加到一个数据库表中,该表由键、传递表和失败表组成,我每天/每周填充这些表,以便在站点上显示为统计数据。我已经看到了一些情况,您可以迭代一个子查询,但是由于两个执行的查询截然相反,所以我看不出有任何解决方案。

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

// Andreas (SQL新手)

编辑:

哦,进退两难,在哪里设置解决方案,我做了一个组合戈登和乔,使最快的查询,工作起来像一个魅力:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 19:21:54

我认为您应该使用一个查询来完成所有这些操作,该查询返回所需的键和信息:

代码语言:javascript
运行
复制
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中有一个键列表,那么您可以:

代码语言:javascript
运行
复制
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看起来可能是:

代码语言:javascript
运行
复制
where key in (2, 3, 4, 5)
票数 1
EN

Stack Overflow用户

发布于 2013-03-04 19:18:24

尝试:

代码语言:javascript
运行
复制
select key, pass, count(*) from testcase group by key, pass

pass上的索引将是无用的。在key上索引,这应该会有一点帮助。但如果基数是4-10,就不会有太大帮助了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15209249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档