使用cos / sin计算半径距离,包括if / then和inner join

时间:2017-11-14 11:53:45

标签: sql inner-join sin cos

我需要什么:

我需要在查询中编写某种IF语句来选择不同的坐标,如果 table1.business_id等于1

例如:

lng 选择lattable1字段,如果 table1.business_id = 1,则选择lnglat来自table2的字段。

查询:

SELECT *, 
(3959 * acos(
   cos(radians('.$cords['result']['latitude'].')) * 
   cos(radians(lat)) * cos( radians(lng) - 
   radians('.$cords['result']['longitude'].')) + 
   sin(radians('.$cords['result']['latitude'].')) * 
   sin(radians(lat))
)) AS distance 
   FROM table1 INNER JOIN table2 ON table2.id = table1.business_id 
   WHERE type <> "industry" AND '.$query.'
   HAVING distance < '.$radius.'
   ORDER BY distance LIMIT 100

我怎么能让这个工作?如何编写技术上正确的查询?

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

您可以使用CASE语句或IF语句来控制流量。我们的想法是确定从哪个表使用数据:

IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`) 

将取代lat的所有现有用途(以及long的相同用途)

SELECT *, 
(3959 * acos(
   cos(radians('.$cords['result']['latitude'].')) * 
   cos(radians(IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`))) * 
   cos( radians(IF(`table1`.`business_id` = 1, `table1`.`lng`, `table2`.`lng`)) - 
   radians('.$cords['result']['longitude'].')) + 
   sin(radians('.$cords['result']['latitude'].')) * 
   sin(radians(IF(`table1`.`business_id` = 1, `table1`.`lat`, `table2`.`lat`)))
)) AS distance 
   FROM table1 INNER JOIN table2 ON table2.id = table1.business_id 
   WHERE type <> "industry" AND '.$query.'
   HAVING distance < '.$radius.'
   ORDER BY distance LIMIT 100

无关,看起来您将值连接到查询中。要非常小心,你不能打开SQL注入攻击!

答案 1 :(得分:0)

我认为通过几次转换,cos和sin的计算相当沉重。

我建议先选择一个矩形

where abs(latitude1-latitude2)<latdif
and abs(longitude1-longitude2)<longdif

然后在临时表,视图或子查询中使用它。

这不是问题的完整答案。

答案 2 :(得分:0)

'你可以在

时使用案例
select a, b,
case 
  when table1.business_id = 1 
  then 'Pick lng and lat fields from table1'
  else 'pick lng and lat fields from table2' 
end col1, clo2
from table1, table 2 where table1.id = table2.id