Можете ли вы использовать псевдоним в предложении WHERE в mysql?
Мне нужно использовать псевдоним в предложении WHERE, но он продолжает говорить мне, что его неизвестный столбец. Есть ли способ обойти эту проблему? Мне нужно выбрать записи, которые имеют рейтинг выше x. рейтинг рассчитывается как следующий псевдоним:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
4 ответов:
вы можете использовать предложение HAVING, которое можете посмотреть псевдонимы, например,
HAVING avg_rating>5но в предложении where вам нужно будет повторить свое выражение, например
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5но! Не все выражения будут разрешены - использование агрегирующей функции, такой как SUM, не будет работать, и в этом случае вам нужно будет использовать предложение HAVING.
С MySQL Manual:
недопустимо ссылаться на a псевдоним столбца в предложение WHERE, потому что значение столбца может еще не быть быть определено, когда предложение WHERE выполняемый. Смотрите Раздел 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 при запросе представления.
Comments