2012-08-26 39 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