質問

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句でそのエイリアスを使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top