2013-05-11 104 views
0

考慮這個SQL查詢:顯示標記

SELECT * FROM 
( 
SELECT * FROM wp_postmeta 
WHERE 
(
meta_key = 'latitude' AND meta_value *1 BETWEEN 47.3641471102 AND 47.3731524898) 
OR (meta_key = 'longitude' AND meta_value *1 BETWEEN 8.53253429117 AND 8.54583070883) 
) 
AS PostMeta, wp_posts 
WHERE wp_posts.id = PostMeta.post_id order by post_id asc 

它給了我符合特定值或特定值之間的經度之間要麼緯度的所有記錄。我想得到的是符合兩個值的記錄。 但將查詢中的'OR'更改爲'AND'將給我零結果。

我想我需要做某種子查詢,但不知道如何做到這一點。

有人嗎?

+0

看看[這個問題](HTTP:///stackoverflow.com/questions/16249731/mysql-select-query-with-multiple-conditions)。此外,你沒有得到完全的「半徑內的標記」,你需要進一步使用[Haversine公式](http://en.wikipedia.org/wiki/Haversine_formula)或類似的過濾結果。 – DCoder 2013-05-11 11:31:31

回答

0

你真的只需要從你的經度子查詢中分離你的緯度子查詢。現在,我有更多的時間,我會更明確地返工查詢:

SELECT 
    /* You're only interested in the wp_posts data, right? */ 
    /* You don't care about the data from wp_postmeta. */ 
    /* Only select the data you're actually going to use. */ 
    /* Ideally you'd specify each column in wp_posts that you're */ 
    /* going to use and ignore the rest */ 
    p.* 
FROM 
    wp_posts p 
     JOIN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'latitude' AND CAST(meta_value AS DECIMAL) BETWEEN 47.3641471102 AND 47.3731524898) lat ON p.id = lat.post_id 
     JOIN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'longitude' AND CAST(meta_value AS DECIMAL) BETWEEN 8.53253429117 AND 8.54583070883) long ON p.id = long.post_id 
ORDER BY 
    post_id ASC 

......因爲沒有哪一個wp_postmeta記錄將既是緯度和經度,你不能(至少不近就像這樣)在相同的WHERE子句中匹配它們。相反,創建兩個單獨的調用wp_postmeta表,一個緯度和一個經度,並迫使他們都匹配(因此INNER JOIN,而不是LEFT JOIN

+0

我通過很多幫助獲得了當前的查詢,所以您可以更詳細些嗎? – moppedisco 2013-05-11 13:57:04

+0

很快寫下了我原來的帖子,花了一點時間讓它更加明確。 – Jason 2013-05-13 21:04:08