Почему эти два, казалось бы, похожих запроса MySQL дают совершенно разные результаты? - PullRequest
0 голосов
/ 24 марта 2019

Я хочу получить список единиц, которые имеют общую оценку менее 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 голосов
/ 24 марта 2019

Ваш первый запрос просматривает все записей и вычисляет среднюю оценку по идентификатору единицы, а затем предложение HAVING ограничивает конечный результат записями, где средняя оценка по идентификатору единицы меньше 4.

Ваш второй запрос перечисляет все записи, где рейтинг меньше 4, и это все, что он делает. Это ничего не усредняет.

Вот пара проходимых уроков, которые я нашел с помощью Google:

HAVING фильтрует агрегированные значения, такие как SUM, AVG, MIN, MAX и т. Д. Он похож на WHERE, но WHERE только фильтры не -агрегированные ценности. Вы можете сделать это:

SELECT UnitId, AVG(Rating)
FROM MyTable
GROUP BY UnitId
HAVING AVG(Rating) < 4 -- Good: HAVING is for filtering on aggregate values

Но вы не можете этого сделать (единственное отличие сверху - WHERE вместо HAVING в последней строке):

SELECT UnitId, AVG(Rating)
FROM MyTable
GROUP BY UnitId
WHERE AVG(Rating) < 4 -- Bad: WHERE is for the raw values, before they're aggregated

Продолжай. Вы получите там:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...