WHERE 句でエイリアスを使用する必要がありますが、不明な列であると表示され続けます。この問題を回避する方法はありますか? x より高い評価を持つレコードを選択する必要があります。評価は次のエイリアスとして計算されます。
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
WHERE 句でエイリアスを使用する必要がありますが、不明な列であると表示され続けます。この問題を回避する方法はありますか? x より高い評価を持つレコードを選択する必要があります。評価は次のエイリアスとして計算されます。
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
これが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 ...
この質問はかなり古く、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
クエリが静的である場合は、それをビューとして定義し、ビューのクエリ中に where 句でそのエイリアスを使用できます。