繁体   English   中英

如何在MySQL WHERE子句中使用别名列?

[英]How to use an aliased column in a MySQL WHERE clause?

我有一个这样的MySQL查询:

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的行。 这对我来说似乎很简单,但是我似乎无法使其正常工作。 无论我在哪里尝试,无论在哪里尝试,无论何时尝试添加此限制,都不会得到任何回报。 我很肯定表中应该返回数据。 有谁知道我该怎么做?


我已经尝试过了,但是仍然无法正常工作。 有什么想法为什么它仍然不起作用?

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;

我对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;

这个查询对我有用...

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

啊,我找到了它的地方。

现在的声明是:

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 Occurrences正常工作,

根据SQL标准,列的别名在查询正文中不可用,这是一个令人烦恼的麻烦。 给定您尝试过的内容,听起来好像MySQL(和其他一些DBMS)也是如此。 您可能必须在ORDER BY子句中重复该表达式。

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

我认为聚合应该在HAVING子句中。 虽然,我当然不知道是否接受别名。

HAVING (Occurrences > 0)

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

或者,您可以使用子查询:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM