2012-05-06 9 views
3

以下のクエリは、3つの異なる配列から緯度、経度、およびID入力を受け取るループ内(PHP内)です。配列内の各位置/キーについて、以下のクエリを使用して、最も近い地理的場所がテーブルから選択されます。配列ループ内でクエリの代わりに1つのMysqlクエリを使用するには?

通常、アレイのサイズは約500であるため、最も近い地理的な位置を見つける必要がある入力セットは500セットですので、時間がかかります。

私の質問:phpの入力配列を使用して一度に1つのクエリを使用し、各配列キーに最も近いすべての地理的位置のセットを選択する方法はありますか?

$sql="SELECT 
id, d, tolon, tolat, du, 
     (3959 * acos(cos(radians($lat1)) 
       * cos(radians(travel.tolat)) 
       * cos(radians(travel.tolon) - radians($lon1)) 
       + sin(radians($lat1)) 
       * sin(radians(travel.tolat)))) AS distance 
FROM travel 
WHERE userid = $id AND tolon > $lonlow AND tolon < $lonhigh AND tolat > $latlow AND tolat < $lathigh 
having distance < $maxdistance ORDER BY distance 
"; 
+0

悪化したソリューションはUNIONになりますが、確かに良いアイデアが投稿されるでしょう。あなたは試してみましたか...または –

+0

私は一時テーブルに配列を挿入しようとすると、定期的な結合を使用することができます。少なくともそれは出発点です – ingo

+0

@ ingoジョインは、2つのテーブルの地理座標間の最小距離で定義されているので、ジョインするのは簡単ではありません。これは数式で計算されます。 – BastiaanWW

答えて

1

あなただけの最も近いが必要な場合limit 1を追加することは良いアイデアですが、私は、あなたが労働組合の束よりもはるかに良いをやるとは思いません。たくさんの組合が非常に長いSQL文字列になり、あなたが打つかもしれない限界があります(max packet sizeは私の設定です)。あなたはおそらく一度に100またはそれ以上の組合をチャンクしなければならないでしょう。

テーブルにこのタイプのクエリ用に設計されたインデックスがある場合は、となるべくが得られます。 mysqlはspatial indexesのためにsuportを持っています。このユースケースでは、通常のインデックスがうまく動作しないため、真剣に検討する必要があります。

+0

この回答に加えて、データベースから必要なレコード数を制限するために、配列からの固有の値を使用しました。 – BastiaanWW

関連する問題