2010-02-02 257 views
2
多行

我想这样的查询在MYSQL子查询返回

select 
Sum(case when WindowsXP = "PASS" then 1 else 0 end) as PASS , 
Sum(case when WindowsVista = "FAIL" then 1 else 0 end) as FAIL 

from OS_Table where BuildID = (select distinct BuildID from OS_Table) 
group by BuildID 

错误是子查询返回不止一行。如果我使用IN,而不是=那么查询是怎么回事永远(近3分钟后也不会停止)

基本上,我想实现的是为每个不同的BuildID,给我PASS的计数,失败时的WindowsXP = “PASS” 和WindowsVista的= “FAIL”

我几乎10个不同BuildID的

如何实现这一目标?

回答

2

只是删除您的加入,它是多余的:

SELECT buildid, 
     SUM(CASE WHEN WindowsXP = 'PASS' THEN 1 ELSE 0 END) as PASS , 
     SUM(CASE WHEN WindowsVista = 'FAIL' THEN 1 ELSE 0 END) as FAIL 
FROM OS_Table 
GROUP BY 
     buildId 

这种情况

WHERE BuildID IN (SELECT DISTINCT BuildID FROM OS_Table) 

适用于表中的任何非空buildid

更新:

原始查询(用=运营商)的意思是:“采取一切记录从那里buildId等于的buildIdDISTINCT值从同一个表采取的表,他们分成几根据buildID的值分组,并计算每个组内表达式的总和“。

=运算符需要双方都有一个标量。在SQL中,当且仅当它返回一个字段和至多一条记录的记录集时,才将查询视为标量。

您的子查询返回了更多的一条记录,所以您的原始查询失败(带有相当多的描述性错误)。

随着IN操作,查询的意思是“从桌上拿起其中buildId是在buildId“同一个表中取是清单的任何地方发现的所有记录,将它们分成几组根据buildID和计算值各组内表达的总和“。

由于buildId总是在buildIs的列表中找到,所以从同一张表中可以看出,条件是多余的。

+0

能否请你用英文解释我的查询意味着什么?我想要做什么? – JPro 2010-02-02 11:48:53

+0

好的。使用IN运算符,是查询进入无限循环?或者什么时候它完全停止? – JPro 2010-02-02 15:13:09

+0

似乎你的'buildID'字段没有编入索引。否则,'MySQL'只会使用'index_subquery',这会对每个'buildId'进行一次索引扫描。没有索引,它必须为它解析的每条记录运行独特的查询。这个循环并不是无穷无尽的,它只是很长。无论如何,这种情况根本没用。 – Quassnoi 2010-02-02 15:19:59

1

如果你希望你的输出包括所有BuildID S,你不需要WHERE都:

SELECT 
    BuildID 
    , SUM(CASE WHEN WindowsXP = "PASS" THEN 1 ELSE 0 END) AS PASS 
    , SUM(CASE WHEN WindowsVista = "FAIL" THEN 1 ELSE 0 END) AS FAIL 
FROM 
    OS_Table 
GROUP BY 
    BuildID 

免责声明:未经测试。

+0

你能用英文解释我的问题吗?我想要做什么?我需要更多地理解SQL – JPro 2010-02-02 11:52:30