为什么这两个看似相似的MySQL查询返回的结果完全不同?

时间:2019-03-23 21:49:51

标签: mysql clause

我想提取一个总体评分小于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
;
```

1 个答案:

答案 0 :(得分:0)

您的第一个查询查看记录的 all 并按单位ID计算平均评分,然后HAVING子句将最终结果限制为单位ID的平均评分较低的记录比4。

您的第二个查询列出了所有评分小于4的记录,仅此而已。它什么都没有。

以下是我在快速的Google上找到的几个不错的教程:

HAVING过滤汇总值,例如SUMAVGMINMAX等。它与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

坚持下去。您将到达那里:)