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


121

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

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

Ответы:


229

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


1
Если я повторю это выражение, оно скажет мне: «Недопустимое использование групповой функции»

3
Изменили формулировку, чтобы сделать ее более ясной. Агрегирующие функции запрещены
Пол Диксон,

Хорошее объяснение, особенно. часть «но в предложении where ... повторить ..»
th3an0maly

4
Это хороший ответ, но, пожалуйста, примите во внимание влияние на производительность, поскольку HAVINGвыполняется после получения данных и WHEREвыполняется раньше.
StockB

Вы не можете использовать агрегатные функции в предложении WHERE. Предложение WHERE фильтрует только строки по одной, а не целые группы.
Билл Карвин,

33

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

7

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

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


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.