如果存在值,则选择具有多个表的SQL语句

时间:2017-02-17 01:55:57

标签: sql

location_data table

id (pk) 
lng
lat

voting_data table

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 - &gt;如果某个位置具有匹配的投票数据(VoteData.LocationID = LocationData.ID),则添加到列表中 - &gt;编码为JSON

不知道如何做到这一点......提前谢谢。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

您需要在location_data.id = voting_data.location_id

中加入查询中的voting_data表