MySQL 如何避免错误“WHERE 中不允许使用聚合函数”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20991729/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 19:47:22  来源:igfitidea点击:

How to avoid error "aggregate functions are not allowed in WHERE"

mysqlsqlaggregate-functions

提问by D-Lef

This sql code throws an

这个 sql 代码抛出一个

aggregate functions are not allowed in WHERE

WHERE 中不允许使用聚合函数

SELECT o.ID ,  count(p.CAT)
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
WHERE count(p.CAT) > 3
GROUP BY o.ID;

How can I avoid this error?

我怎样才能避免这个错误?

回答by Aziz Shaikh

Replace WHEREclause with HAVING, like this:

用 替换WHERE子句HAVING,像这样:

SELECT o.ID ,  count(p.CAT)
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
GROUP BY o.ID
HAVING count(p.CAT) > 3;

HAVINGis similar to WHERE, that is both are used to filter the resulting records but HAVINGis used to filter on aggregated data (when GROUP BYis used).

HAVING类似于WHERE,即两者都用于过滤结果记录,但HAVING用于过滤聚合数据(何时GROUP BY使用)。

回答by Saharsh Shah

Use HAVINGclause instead of WHERE

使用HAVING子句代替WHERE

Try this:

尝试这个:

SELECT o.ID, COUNT(p.CAT) cnt
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
GROUP BY o.ID HAVING cnt > 3

回答by user7872783

Will self join will go for a toss with join where we have a condition to list prices that are greater than the median of the prices listed in the order table?

在我们有条件列出大于订单表中所列价格中位数的价格时,self join 是否会与 join 折腾?

Eg. order_item, Order_Price

例如。订单商品,订单价格

Since aggregate functions cannot be used in a WHERE clause >

由于不能在 WHERE 子句中使用聚合函数 >

select a.order_item_product_price, count(distinct 
a.order_item_product_price) from 
default.order_items a , default.order_items b
where a.order_item_product_price = b.order_item_product_price
group by a.order_item_product_price
having a.order_item_product_price > appx_median(b.order_item_product_price)
order by a.order_item_product_price limit 10