2012-08-26 40 views
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 
+0

您可能还想看看MySQL的[GIS扩展](http://dev.mysql.com/doc/en/gis-introduction.html)。 – eggyal

+0

@dcolumbus我们希望您付出努力。您尝试过什么? –

回答

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 

人们可以通过直接接合meta_tablemarkers两次(在相关meta_key S)然后引用避免子查询中的meta_value小号,而不是直接latlng ,但我认为上述内容更具可读性且更易于遵循。但是,为了完整性:

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 
+0

我可以看到上面的查询,但我不确定如何将这两者结合起来。你看,中间的函数需要处理lat和lng参数的半径。 – dcolumbus

+0

@dcolumbus:'... FROM markers JOIN()AS t ...' – eggyal

+0

你会如此友好,只是在你的回答中加入他们?查询是如此特别,以至于如果有问题,我会试图找出问题。 – dcolumbus