2017-02-17 63 views
1

location_data表SQL SELECT語句的多個表如果值存在

id (pk) 
lng 
lat 

voting_data表

id (pk) 
location_id (= location_data.id) 
vote 

這是當前縮短查詢我要找回我的位置數據,被編碼成JSON。

SELECT 
    `id`, `lat`, `lng`, 
    (6371 * acos(cos(radians('%s')) * cos(radians(lat)) * 
     cos(radians(lng) - radians('%s')) + sin(radians('%s')) * 
     sin(radians(lat)))) AS distance 
FROM 
    location_data 
HAVING 
    distance < 50 

有些地方有額外的「投票數據」,我想編碼以及成JSON(與相應的位置沿配對),但只有當它們存在(VoteData.LocationID = LocationData.ID)。

僞代碼:讓所有LocationData隨着距離的條件 - >如果某個位置有匹配的投票數據(VoteData.LocationID = LocationData.ID),添加到列表 - >編碼成JSON

不知道該怎麼辦這雖然...提前感謝。

+0

什麼是匹配的投票數據和爲什麼會甚至會影響您想查詢? –

+0

匹配意味着VoteData.LocationID = LocationData.ID。我認爲在一個查詢中這樣做會更容易。 – Vivida

+0

您正在使用哪些DBMS? –

回答

1

我認爲一個基本的加入將在這裏工作:

SELECT t1.id, t1.lat, t1.lng, 
     (6371 * acos(cos(radians('%s')) * cos(radians(t1.lat)) * cos(radians(t1.lng) - radians('%s')) + sin(radians('%s')) * sin(radians(t1.lat)))) AS distance, 
     COALESCE(t2.vote, 'NA') AS voting_data 
FROM location_data t1 
LEFT JOIN voting_data t2 
    ON t1.id = t2.location_id 
HAVING distance < 50 

這不會50公里半徑範圍內的過濾掉任何位置。而沒有匹配vote數據的記錄將返回'NA'

+0

絕對完美!非常感謝!! – Vivida

0

你需要加入voting_data表中查詢上location_data.id = voting_data.location_id