2010-08-11 84 views
2

如果我有一个查询,如:在MySQL使用生成列where子句

select column1, (
    select count(*) from table2 
) as some_count 
from table1 
where column1 = 'foo' 

我可以在where子句中使用column1,但如果我尝试添加

and some_count > 0 

然后我收到一个错误,some_count不存在。我如何在where子句中使用它?

回答

11

使用HAVING

select column1, (
    select count(*) from table2 
) as some_count 
from table1 
HAVING some_count > 0 
+0

在GROUP BY&HAVING中引用MySQL和SQL Server支持列别名,但Oracle不支持。但是,SQL Server会引发一个错误,因为这两个列都不包含在聚合中或在GROUP BY子句中提到。只有在MySQL和SQLite上这个查询才是有效的,+1 – 2010-08-11 22:56:46

+0

这是完美的,这是为WordPress的网站,所以它运行MySQL,但我很高兴看到有关oracle和sql server的陷阱 – 2010-08-11 23:01:02

3

原样,唯一的办法是使用派生表:

SELECT x.* 
    FROM (select column1, 
       (select count(*) from table2) as some_count 
      from table1 
     where column1 = 'foo') x 
WHERE x.some_count > 0 

你意识到,如果没有相关性,some_count是否会返回一个返回的每一行相同的值?

+0

是的,这只是一个简单的例子。但我从来没有想过(或知道如何)使用派生表。我将试一试 – 2010-08-11 22:50:51