2008-10-14 5 views
90

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

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

ответ

182

Вы можете использовать предложения HAVING, который может увидеть псевдонимы, например,

HAVING avg_rating>5 

, но в условии where вам нужно будет повторить свое выражение, например.

WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5 

НО, НО! Не все выражения будут разрешены - использование агрегирующей функции, такой как SUM, не будет работать, и в этом случае вам нужно будет использовать предложение HAVING.

От MySQL Manual:

Это не допустимо ссылаться на псевдоним в столбца в предложении WHERE, , поскольку значение столбца может не быть определена, когда ИНЕКЕ выполняется. См. Section B.1.5.4, “Problems with Column Aliases”.

+1

Если я повторяю выражение, он говорит мне: «недопустимое использование функции группы» – 2008-10-14 06:57:25

+3

Have изменено, чтобы сделать его более четкими функции агрегирования, не разрешенные – 2008-10-14 07:04:03

28

Незнайка, если это работает в 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 ... 
0

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

2

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

Смежные вопросы