Можете ли вы использовать псевдоним в предложении WHERE в MySQL? - PullRequest
114 голосов
/ 14 октября 2008

Мне нужно использовать псевдоним в предложении WHERE, но он постоянно говорит мне, что это неизвестный столбец. Есть ли способ обойти эту проблему? Мне нужно выбрать записи, которые имеют рейтинг выше, чем х. Рейтинг рассчитывается как следующий псевдоним:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating

Ответы [ 4 ]

213 голосов
/ 14 октября 2008

Вы можете использовать предложение 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, «Проблемы с псевдонимами столбцов» .

31 голосов
/ 14 октября 2008

Не знаю, если это работает в 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 голосов
/ 10 июля 2017

Этот вопрос довольно старый, и один ответ уже набрал 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

0 голосов
/ 21 октября 2014

Если ваш запрос статический, вы можете определить его как представление, а затем использовать этот псевдоним в предложении where при запросе представления.

...