Можете ли вы использовать псевдоним в предложении WHERE в mysql?
Мне нужно использовать псевдоним в предложении WHERE, но он продолжает говорить мне, что его неизвестный столбец. Есть ли способ обойти эту проблему? Мне нужно выбрать записи, имеющие рейтинг выше x. Рейтинг рассчитывается как следующий псевдоним:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Ответы
Ответ 1
Вы можете использовать предложение HAVING, которое может видеть псевдонимы, например
HAVING avg_rating>5
но в предложении where вам нужно будет повторить свое выражение, например.
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
НО! Не все выражения будут разрешены - использование агрегирующей функции, такой как SUM, не будет работать, и в этом случае вам нужно будет использовать предложение HAVING.
Из Руководство по MySQL:
Нельзя ссылаться на псевдоним столбца в предложении WHERE, потому что значение столбца может еще определяется, когда предложение WHERE выполняется. См. Раздел B.1.5.4, "Проблемы с псевдонимами столбцов" .
Ответ 2
Не знаю, если это работает в 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 ...
Ответ 3
Этот вопрос довольно старый, и один ответ уже получил 160 голосов...
Тем не менее я бы сделал это ясно: на самом деле вопрос не в том, можно ли использовать имена псевдонимов в предложении WHERE
.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
является агрегацией. В предложении WHERE
мы ограничиваем записи, которые мы хотим получить из таблиц, просматривая их значения. sum(reviews.rev_rating)
и count(reviews.rev_id)
, однако, не являются значениями, которые мы находим в записи; они являются значениями, которые мы получаем только после агрегирования записей.
So 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
Ответ 4
Если ваш запрос статический, вы можете определить его как представление, тогда вы можете использовать этот псевдоним в предложении where при запросе представления.
Ответ 5
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
WHERE gender = 'F') AS c
WHERE c.custId = 100;