mysqlのWHERE句でエイリアスを使用できますか?
-
03-07-2019 - |
質問
WHERE句でエイリアスを使用する必要がありますが、不明な列であることを通知し続けます。この問題を回避する方法はありますか? xより高い評価を持つレコードを選択する必要があります。評価は次のエイリアスとして計算されます。
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
解決
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をご覧ください。 “列エイリアスの問題” 。
他のヒント
これが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
nor
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句でそのエイリアスを使用できます。