我需要什么:
我需要在查询中编写某种IF语句来选择不同的坐标,如果 table1.business_id
等于1
。
例如:
从lng
选择lat
和table1
字段,如果 table1.business_id = 1
,则选择lng
和lat
来自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
我怎么能让这个工作?如何编写技术上正确的查询?
感谢您的回答。
答案 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