2009-01-27 49 views
0

我有一个MySQL查询像这样:如何在MySQL WHERE子句中使用别名列?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q 
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10; 

我想限制结果行,其中出现次数> 0。这对我来说似乎很简单,但我似乎无法使其工作。无论我尝试什么,WHERE或HAVING,每当我尝试添加这个限制时,我都会得到NO ROWS。我确信我的表中有数据应该返回。有谁知道如何完成我在做的事情?


我试过这个,但它仍然不起作用。任何想法,为什么它仍然无法正常工作?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q 
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10; 

回答

5

我不熟悉的MySQL,因为我与SQL Server,但在T-SQL,你不能使用别名在GROUP BY子句中(我最初认为ORDER BY子句也是这样,但是后来证明它不正确)。在这种情况下,你要根据GROUP BY的结果进行过滤,所以我会按如下方式使用HAVING子句:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences 
FROM 
    some_table AS q 
WHERE 
    criterion = 'value' 
GROUP BY 
    q.P_id 
HAVING 
    SUM(... some SQL removed for brevity ...) > 0 
ORDER BY 
    Occurrences DESC 
LIMIT 10; 
+0

啊,那工作。尽管如此,按照别名排序的结果工作良好。 – stalepretzel 2009-01-27 01:20:13

+0

很高兴知道。我已经更新了答案。 – 2009-01-27 01:22:22

0

根据SQL标准,列别名在查询的主体中不可用,这是一个混淆的滋扰。鉴于你已经尝试过,听起来好像MySQL(和其他一些DBMS)也是如此。您可能必须在ORDER BY子句中重复表达式。

此外,GROUP BY子句应列出*中的每一列,而不仅仅是主键(尽管在逻辑上指定主键应该足够)。

0

我相信聚合应该在HAVING条款。虽然,不可否认,我不确定别名是否被接受。

HAVING (Occurrences > 0) 

HAVING (SUM(...some SQL removed for brevety) > 0) 

或者,你可以使用一个子查询:

SELECT * 
FROM (
    -- your current query 
) AS sub 
WHERE (Occurences > 0) 
1

啊,我发现这个地方吧。

的语句现在是:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q 
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10; 

这似乎是工作的罚款与ORDER BY纪录,

2

此查询的工作对我来说...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10 
order by total_qty desc