2012-12-20 37 views

回答

1

兩個值一個結果集:

SELECT * 
FROM wp_postmeta 
WHERE meta_key IN ('property_lat', 'property_long') 

兩個值一行:

SELECT (SELECT meta_value FROM wp_postmeta WHERE meta_key='property_lat' LIMIT 1) AS lat, 
     (SELECT meta_value FROM wp_postmeta WHERE meta_key='property_long' LIMIT 1) AS lng 
+0

關閉!但我需要'property_lat'和'property_long'在同一行內。 – dcolumbus

+0

「#1242 - 子查詢返回多於一行」 – dcolumbus

+0

顯然,您有多個具有相同meta_key的行。因此你不能依賴它。技術上你可以利用LIMIT 1來避免這個錯誤。但我想你需要使用ID來定位WHERE子句中的特定行在子查詢 – peterm

0

早產的解決方案不能讓你所有的緯度/經度對一次。它一次只能給你一個ID。我不是專家足夠SQL保證這會工作的時候了,但我認爲你正在尋找的東西是這樣的:

SELECT tbl.ID, lat.meta_value, lng.meta_value 
FROM wp_postmeta AS tbl 
INNER JOIN wp_postmeta AS lat ON lat.ID = tbl.ID AND lat.meta_key='property_lat' 
INNER JOIN wp_postmeta AS lng ON lng.ID = tbl.ID AND lng.meta_key='property_long' 
WHERE meta_key IN ('property_lat', 'property_long') 
GROUP BY tbl.ID 
+0

我修改了查詢,它似乎工作...'SELECT tbl.ID,lat.meta_value,lng.meta_value FROM wp_posts AS TBL INNER JOIN wp_postmeta AS LAT ON lat.post_id = tbl.ID AND lat.meta_key = 'property_lat' INNER JOIN wp_postmeta AS LNG ON lng.post_id = tbl.ID AND lng.meta_key = '' property_long LIMIT 0 ,30'但是,我怎麼修改這個以便我可以通過半徑得到結果?本白皮書包含SQL:http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL – dcolumbus

+0

我只是在PHP中這樣做,因爲我在這方面做得更好。但你似乎已經用SQL解決了這個問題,我猜想它更有效率:) –

0

有了您的幫助,我是能夠建立我的查詢:

SET @centerLat = '48.428289'; 
SET @centerLng = '-123.380585'; 

SELECT wp_posts.*, 
(3959 * acos(cos(radians(@centerLat)) * cos(radians(lat.meta_value)) * cos(radians(lng.meta_value) - radians(@centerLng)) + sin(radians(@centerLat)) * sin(radians(lat.meta_value)))) AS distance 

FROM wp_posts 

LEFT JOIN wp_postmeta AS lat 
    ON lat.post_id = wp_posts.ID 
     AND lat.meta_key = 'property_lat' 

LEFT JOIN wp_postmeta AS lng 
    ON lng.post_id = wp_posts.ID 
     AND lng.meta_key = 'property_long' 

WHERE lat.meta_key IS NOT NULL 

HAVING distance > 5 

LIMIT 0 , 20 

謝謝!