0

このクエリを更新するのに助けが必要です:

$query = sprintf(
   "SELECT 
        lat, 
        lng, 
        ( 
            3959 * acos( cos( radians('%s') ) * 
                         cos( radians( lat ) ) * 
                         cos( radians( lng ) - radians('%s') ) + 
                         sin( radians('%s') ) * 
                         sin( radians( lat ) ) 
                       ) 
        ) AS distance 
    FROM 
        markers 
    HAVING 
        distance < '%s' 
    ORDER BY 
        distance LIMIT 0 , 20"

次のようなテーブル構造を使用します。

lat        | lng
23.0324234 | -103.0324234

次のようなテーブルのキー、値の列構造から取得できるクエリにshipping_latshipping_long

meta_key      | meta_value
shipping_lat  | 23.0324234
shipping_long | -103.0324234
4

1 に答える 1

1

メイン クエリ (または同様のクエリ) に結合するサブクエリとして次を使用しますか?

SELECT t1.meta_value AS lat, t2.meta_value AS lng
FROM   meta_table t1 JOIN meta_table t2
WHERE  t1.meta_key = 'shipping_lat'
   AND t2.meta_key = 'shipping_long'

あれは:

SELECT 
    lat, 
    lng, 
    ( 
        3959 * acos( cos( radians('%s') ) * 
                     cos( radians( lat ) ) * 
                     cos( radians( lng ) - radians('%s') ) + 
                     sin( radians('%s') ) * 
                     sin( radians( lat ) ) 
                   ) 
    ) AS distance 
FROM 
    markers JOIN (
      SELECT t1.meta_value AS lat, t2.meta_value AS lng
      FROM   meta_table t1 JOIN meta_table t2
      WHERE  t1.meta_key = 'shipping_lat'
         AND t2.meta_key = 'shipping_long'
    ) AS t
HAVING 
    distance < '%s' 
ORDER BY 
    distance LIMIT 0 , 20

(関連するs で) two に直接結合meta_tableし、 andの代わりに s を直接参照することで、サブクエリを回避できますが、上記の方が読みやすく、従うのが簡単だと思いました。ただし、完全を期すために:markersmeta_keymeta_valuelatlng

SELECT 
    lat.meta_value, 
    lng.meta_value, 
    ( 
        3959 * acos( cos( radians('%s') ) * 
                     cos( radians( lat.meta_value ) ) * 
                     cos( radians( lng.meta_value ) - radians('%s') ) + 
                     sin( radians('%s') ) * 
                     sin( radians( lat.meta_value ) ) 
                   ) 
    ) AS distance 
FROM 
    markers
      JOIN meta_table lat ON lat.meta_key = 'shipping_lat'
      JOIN meta_table lng ON lng.meta_key = 'shipping_long'
HAVING 
    distance < '%s' 
ORDER BY 
    distance LIMIT 0 , 20
于 2012-08-26T23:30:50.860 に答える