WHERE句でエイリアスを使用する必要がありますが、不明な列であることを通知し続けます。この問題を回避する方法はありますか? xより高い評価のレコードを選択する必要があります。評価は、次のエイリアスとして計算されます。
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
HAVING句を使用できます。これは、canエイリアスを表示できます。
HAVING avg_rating>5
ただし、where句では式を繰り返す必要があります。
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
しかし!すべての式が許可されるわけではありません-SUMなどの集約関数を使用しても機能しません。その場合、HAVING句を使用する必要があります。
MySQL Manual から:
WHERE句の実行時に列の値がまだ決定されていない可能性があるため、WHERE句で列のエイリアスを参照することはできません。 セクションB.1.5.4、「列エイリアスの問題」 を参照してください。
Dunnoこれが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
句で使用できるかどうかについて実際にnotです。
_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
句はHAVING
の後に実行されることになっているため、標準では有効なSQLではありません。 MySQLドキュメントから:
標準SQLの別のMySQL拡張機能は、選択リスト内のエイリアス式へのHAVING句の参照を許可します。
MySQL拡張により、集計列のHAVING句でエイリアスを使用できます
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
クエリが静的な場合、ビューとして定義でき、ビューのクエリ中にwhere句でそのエイリアスを使用できます。
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
WHERE gender = 'F') AS c
WHERE c.custId = 100;