web-dev-qa-db-ja.com

mysqlのWHERE句でエイリアスを使用できますか?

WHERE句でエイリアスを使用する必要がありますが、不明な列であることを通知し続けます。この問題を回避する方法はありますか? xより高い評価のレコードを選択する必要があります。評価は、次のエイリアスとして計算されます。

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
116
user15063

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、「列エイリアスの問題」 を参照してください。

217
Paul Dixon

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 ...
31

この質問は非常に古く、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

4

クエリが静的な場合、ビューとして定義でき、ビューのクエリ中にwhere句でそのエイリアスを使用できます。

0
alpere
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
0
anson