Можете ли вы использовать псевдоним в предложении 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;