所以我已经尝试了一个多星期,我把它搁置了,因为我无法让它工作,但这就是我正在努力做的事情;
从数据库中选择一个产品>使用左外部连接加载其评级并将其取平均值> 使用内部连接获取不同的信息(不是很重要,但无论如何我都会说)。
这是我查询的简化(但准确)副本 - 原始内容很长,并且其中包含不同的语言单词,因此可能会有点混乱;
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
会起作用,但遗憾的是它没有。这有什么可能做到的吗?
谢谢。
在GROUP BY
后尝试HAVING AVG(RATING.rating) > 3
。
有关更多详细信息,请参阅 MSDN 上的 HAVE。
您应该使用 HAVING
子句。 WHERE
子句在分组之前筛选结果集,而 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