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 上)然后直接引用 s 而不是 and 来避免子查询meta_tablemarkersmeta_keymeta_value认为lat上面lng的内容更具可读性和更容易理解。但是,为了完整性:

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 回答