回答:
エイリアスを表示できる 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「列エイリアスの問題」を参照してください。
HAVING
、データがフェッチされた後にWHERE
実行され、前に実行されるため、パフォーマンスへの影響を考慮してください。
これがmysqlで機能する場合はDunnoですが、sqlserverを使用して、次のようにラップすることもできます。
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
この質問はかなり古く、1つの回答がすでに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でのみ可能です。SELECT
節は後に実行されることになっているため、標準では有効なSQLではありませんHAVING
。MySQLのドキュメントから:
標準SQLに対する別のMySQL拡張では、HAVING句で参照を選択リストのエイリアス表現に参照できます。
MySQL拡張では、集計された列のHAVING句でエイリアスを使用できます
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html