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



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



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

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

    Ничего не найдено.