所以我已经尝试了一个多星期了一点,我把它放在一边因为我无法让它工作但这就是我想要做的事情;
从数据库中选择产品>使用LEFT OUTER JOIN加载其评级并对其进行平均>使用INNER JOIN来获取不同的信息(不是很重要,但无论如何我会这么说)。
这是我的查询的简化(但准确)副本 - 原始版本很长,并且其中包含不同的语言单词,因此可能会有点混乱;
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
会起作用,但遗憾的是它没有。
这有可能做到吗?
感谢。
答案 0 :(得分:3)
在HAVING AVG(RATING.rating) > 3
后尝试GROUP BY
。
有关详细信息,请参阅HAVING on MSDN。
答案 1 :(得分:1)
您应该使用 HAVING
clause 。 WHERE
clause 会在分组之前过滤结果集,而HAVING子句会在分组和聚合之后过滤最终结果集。因此,在WHERE
子句中,您不能使用聚合(在这种情况下为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