Можете ли вы использовать псевдоним в предложении WHERE в MySQL?

StackOverflow https://stackoverflow.com/questions/200200

Вопрос

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

Из Руководство по MySQL:

Не допустимо ссылаться на псевдоним столбца в предложении, где значение столбца еще не может быть определена при выполнении пункта «Где».Видеть Раздел 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 при запросе представления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top