0

私はテーブルの場所を持っています

place_id | city | country_code | zipcode | lat | lon

ここで、場所Aから25マイル以内にある場所を表示したいと思います。場所Aにはplace_id1があります。

SELECT * 
FROM `places` 
WHERE ( 3959 * acos( cos( radians((SELECT lat FROM places WHERE place_id=1)) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians((SELECT lon FROM places WHERE place_id=1)) ) + sin( radians((SELECT lat FROM places WHERE place_id=1)) ) * sin( radians( lat ) ) ) ) < 25;

これは問題なく動作しますが、同じサブクエリが2つあります

SELECT lat FROM places WHERE place_id=1

このクエリを最適化して、2つの同じサブクエリを持たずに、それらを1つにすることは可能ですか?

4

3 に答える 3

2

3つのサブクエリは、外側のテーブルのすべての行に対して実行されます。

あなたができることは、それらのサブクエリを単一に変換することです。JOINこれは、次の緯度と経度を見つけるために、クエリ全体に対して1回だけ実行されますplace_id 1

SELECT a.* 
FROM   places a
JOIN   (SELECT lat, lon FROM places WHERE place_id = 1) b ON
       (3959 * acos( cos( radians(b.lat) ) * cos( radians( a.lat ) ) * cos( radians( a.lon ) - radians(b.lon) ) + sin( radians(b.lat) ) * sin( radians( a.lat ) ) ) ) < 25;
于 2012-08-03T06:49:33.827 に答える
0

サブクエリから新しいテーブルを取得し、次のように元のテーブルと結合します。

SELECT *
FROM places p, (SELECT lat AS new_lat FROM places WHERE place_id = 1) l
WHERE blah blah

これで、サブクエリを列'new_lat'に置き換えることができます。

于 2012-08-03T06:48:50.217 に答える
0

変数@var_lonを使用して、クエリの出力を次のようにキャッシュできます。

SELECT *
FROM `places`
WHERE ( 3959 * acos( cos( radians((SELECT lat FROM places WHERE place_id=1)) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians((SELECT @var_lon := lon FROM places WHERE place_id=1)) ) + sin( radians(@var_lon) ) * sin( radians( lat ) ) ) ) < 25;
于 2012-08-03T06:53:12.903 に答える