0

2 つのクエリを 1 つにまとめようとしています。ご協力いただければ幸いです。

このクエリは、特定の距離内にあるエントリ (郵便番号) のリストを取得します。それはうまくいきます。(現在のところ、$lat、$lng、$zip、および $size はハードコーディングされています)。

ここで、これらの郵便番号に一致する別のテーブルからのエントリの検索と組み合わせて使用​​する必要があります。

これは私のクエリです:

SELECT
    source.zc_zip, 
    source.zc_location_name,
    ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat)) 
         + COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
         - RADIANS($lng))
         ) * 6371 AS distance
FROM zip_coordinates AS source
WHERE zc_id <> $zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;

source.zc_zip が info.meta_value と同じ場合に一致するため、既に次のように変更しました。

SELECT
    source.zc_zip, 
    source.zc_location_name,
    info.*,
    ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat)) 
         + COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
         - RADIANS($lng))
         ) * 6371 AS distance
FROM zip_coordinates AS source, wp_postmeta AS info
WHERE zc_id <> $zip AND info.meta_value = source.zc_zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;

言うまでもなく、このクエリは非常に遅いです (> 1 秒)。

誰でもそれを手伝ってもらえますか?ありがとう!:-)

– ドミニク

4

1 に答える 1

1

私はOPに次のように尋ねました:

2 つのクエリを結合したいのですが、1 つ (2 つのバージョン) をください。しかし、最初のクエリと結合する 2 番目のクエリはどこにありますか?

OPの返事:

  • 最初のクエリは基本的なクエリですが、2 番目のクエリで取得しようとした情報が欠けています。2 番目のクエリは遅いので、オンラインで見つけたものと最初のクエリを組み合わせた 2 番目のクエリに代わるものを探しています。— dmnkhhn 15 8 月 2011 〜で 18:18, で

$lat$lng$zipおよび$sizeは今のところハードコーディングされているため、ストアド プロシージャを使用して計算列として距離を追加することは、おそらくあなたの考えではありません。計算された値の ORDER により、明らかに、すべての行と計算された値のインデックスを含む一時テーブルが作成されます。したがって、時間は行数とともに増加します。高校の数学の本を取り、円の周りの平方を計算します。これらの値を使用して、 の制限を含め、 と の 99% を計算からzc_lat除外します。zc_lonWHERE

の方法: 昨夜のことを考えると、より良い方法はプログラムによるものです: 円の内側の四角形で最も近くにいる 10 人の生きている人を取得します。そうすれば、クエリで計算する必要はありません。プログラムで制限境界を計算します。

結果が少なすぎる場合は、上記の式を使用して、内側の正方形と外側の正方形の間の領域を選択する別のクエリを作成します。これはロケットのように機能します。10 マイルの円を見つけようとしているときに、ほとんどの顧客が正確に 9 ~ 11 マイルの範囲に住んでいる場合を除き、一部のレコードのみで計算を行います。

于 2011-08-15T16:17:19.450 に答える