3

所以我已经尝试了一个多星期,我把它搁置了,因为我无法让它工作,但这就是我想要做的;

从数据库中选择一个产品 > 使用 LEFT OUTER JOIN 加载其评级并对其进行平均 > 使用 INNER JOINs 获取不同的信息(不是很重要,但我还是会说)。

这是我的查询的简化(但准确)副本 - 原件很长并且其中包含不同的语言单词,因此可能会有点混乱;

SELECT 
PRODUCT.name AS Name,
PRODUCT.price AS Price,
BRAND.name AS Brand,
AVG(RATING.rating) AS Rating
FROM PRODUCT
LEFT OUTER JOIN RATING ON RATING.product_id = PRODUCT.product_id
INNER JOIN BRAND ON BRAND.brand_id = PRODUCT.brand_id
GROUP BY PRODUCT.name, PRODUCT.price, BRAND.name

上述工作,但它错过了评级的“过滤”。我希望添加WHERE AVG(RATING.rating) > 3会起作用,但遗憾的是它没有。这有可能吗?

谢谢。

4

2 回答 2

3

尝试HAVING AVG(RATING.rating) > 3你的GROUP BY.

有关详细信息,请参阅MSDN 上的 HAVING 。

于 2013-01-30T10:04:58.683 回答
1

您应该使用该HAVING子句。该WHERE子句在分组之前过滤结果集,而 HAVING 子句在分组和聚合之后过滤最终结果集。所以 inWHERE子句你不能使用聚合(AVG(RATING.rating)在这种情况下),而在HAVING,你可以这样做。

SELECT 
PRODUCT.name AS Name,
PRODUCT.price AS Price,
BRAND.name AS Brand,
AVG(RATING.rating) AS Rating
FROM PRODUCT
LEFT OUTER JOIN RATING ON RATING.product_id = PRODUCT.product_id
INNER JOIN BRAND ON BRAND.brand_id = PRODUCT.brand_id
GROUP BY PRODUCT.name, PRODUCT.price, BRAND.name
HAVING AVG(RATING.rating) > 3
于 2013-01-30T10:05:42.057 回答