我想提取一个总体评分小于4的单位列表。第一个查询返回1760行,其中的数据在交叉引用时似乎正在检查。第二个查询仅返回434行。为什么会这样呢?我不完全理解“分组依据”和“具有”子句,因此我猜想这与它们有关。
'''
SELECT u.unitid
,AVG(r.overall) AS AverageRating
, u.ratingcount
FROM reviews r
LEFT JOIN units u
ON u.unitid = r.unitid
-- only retrieve active, non-terminated units set to display
WHERE u.active = 1
AND u.display = 1
AND u.terminated = 0
GROUP BY u.unitid
HAVING AverageRating < 4
;
```
```
SELECT u.UnitID
, u.rating
, u.ratingcount
from units u
WHERE u.rating < 4
-- only retrieve active, non-terminated units set to display
and u.active = 1
and u.display = 1
and u.terminated = 0
;
```
答案 0 :(得分:0)
您的第一个查询查看记录的 all 并按单位ID计算平均评分,然后HAVING
子句将最终结果限制为单位ID的平均评分较低的记录比4。
您的第二个查询列出了所有评分小于4的记录,仅此而已。它什么都没有。
以下是我在快速的Google上找到的几个不错的教程:
HAVING
过滤汇总值,例如SUM
,AVG
,MIN
,MAX
等。它与WHERE
类似,但是{{ 1}}仅过滤非汇总值。您可以这样做:
WHERE
但是您不能执行此操作(与上面的唯一区别是SELECT UnitId, AVG(Rating)
FROM MyTable
GROUP BY UnitId
HAVING AVG(Rating) < 4 -- Good: HAVING is for filtering on aggregate values
,而不是最后一行的WHERE
)
HAVING
坚持下去。您将到达那里:)