Можете ли вы использовать псевдоним в предложении WHERE в MySQL?
-
03-07-2019 - |
Вопрос
Мне нужно использовать псевдоним в предложении WHERE, но он продолжает сообщать мне, что это неизвестный столбец.Есть ли способ обойти эту проблему?Мне нужно выбрать записи с рейтингом выше x.Рейтинг рассчитывается как следующий псевдоним:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Решение
Вы можете использовать предложение HAVING, которое может см. псевдонимы, например.
HAVING avg_rating>5
но в предложенииwhere вам нужно будет повторить свое выражение, например.
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
НО!Не все выражения будут разрешены — использование агрегатной функции, такой как SUM, не будет работать, и в этом случае вам придется использовать предложение HAVING.
Не допустимо ссылаться на псевдоним столбца в предложении, где значение столбца еще не может быть определена при выполнении пункта «Где».Видеть Раздел B.1.5.4, «Проблемы со псевдонимом столбца».
Другие советы
Не знаю, работает ли это в MySQL, но, используя sqlserver, вы также можете просто обернуть его следующим образом:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
Этот вопрос довольно старый, и один ответ уже набрал 160 голосов...
И все же я бы прояснил это:Вопрос на самом деле нет о том, можно ли использовать псевдонимы в WHERE
пункт.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
является агрегацией.в WHERE
В предложении мы ограничиваем нужные нам записи в таблицах, просматривая их значения. sum(reviews.rev_rating)
и count(reviews.rev_id)
, однако, не являются значениями, которые мы находим в записи;это значения, которые мы получаем только после агрегирования записей.
Так WHERE
неуместно.Нам нужно HAVING
, так как мы хотим ограничить строки результатов после агрегации.Этого не может быть
WHERE avg_rating > 10
ни
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
следовательно.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
с другой стороны, возможно и соответствует стандарту SQL.Тогда как
HAVING avg_rating > 10
возможно только в MySQL.Это недействительный SQL согласно стандарту, так как SELECT
предложение должно быть выполнено после HAVING
.Из документации MySQL:
Другое расширение MySQL к стандартному SQL допускает ссылки в предложении HAVING на выражения с псевдонимами в списке выбора.
Расширение MySQL позволяет использовать псевдоним в предложении HAVING для агрегированного столбца.
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Если ваш запрос статический, вы можете определить его как представление, а затем использовать этот псевдоним в предложенииwhere при запросе представления.