0

次のクエリでは、 と を 2 次元平面内のオブジェクトの座標として使用してxおりy、原点から半径 80 単位以内にあるオブジェクトのみに結果を制限しようとしています。

SELECT *,POW(x - 0,2) + POW(y - 0,2) AS distanceSquared
FROM objects

WHERE distanceSquared < 6400

ここでのクエリは何らかの理由で機能せず、mysql はunknown column distanceSquared in where clause. ただし、に置き換えるWHEREHAVING、完全に正常に動作します。なんで?私の知る限りHAVING、グループ化後に集計関数が使用されている列にのみ適しています。

4

1 に答える 1

3

変数distanceSquaredselectステートメントで定義されます。

where節はそのような変数を認識しませんが、節は認識havingします。

noを指定group byすると、havingjust はwhereMySQL の句のように動作します。

これは、MySQL ではかなり一般的な方法のようです。これは次のようにも表現できます。

select o.*
from (SELECT *,POW(x - 0,2) + POW(y - 0,2) AS distanceSquared
      FROM objects
     ) o
WHERE distanceSquared < 6400;

ただし、MySQL では、サブクエリがインスタンス化されます。つまり、データが実際に作成されて保存されます。そのため、このようなクエリは、サブクエリがない場合よりもパフォーマンスが低下します。他のほとんどのデータベースはこれを正しく最適化し、パフォーマンスへの影響はありません。

このhavinga なしの句の使用group byも、MySQL 拡張です。クエリは、1 行を返す集計クエリとして解釈する必要があります。その後、having句はその集計に対して機能します。

于 2013-06-08T16:00:43.623 に答える