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


121

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

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

回答:


229

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


1
私は式を繰り返した場合、それは私に語った:「グループ機能の使用は無効です」

3
許可されていない集計関数をより明確にするために言い換えました
Paul Dixon

素敵な説明、特に。「しかしwhere句で...繰り返し...」の部分
th3an0maly 2013年

4
これは良い答えですがHAVING、データがフェッチされた後にWHERE実行され、前に実行されるため、パフォーマンスへの影響を考慮してください。
StockB

WHERE句で集計関数を使用することはできません。WHERE句は、グループ全体ではなく、一度に1行のみをフィルタリングします。
Bill Karwin

33

これが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 ...

6

この質問はかなり古く、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


0

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


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.