我有座位
place_id | city | country_code | zipcode | lat | lon
现在我想显示距地点 A 25 英里以内的地点。地点 A 的 place_id 为 1。
SELECT *
FROM `places`
WHERE ( 3959 * acos( cos( radians((SELECT lat FROM places WHERE place_id=1)) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians((SELECT lon FROM places WHERE place_id=1)) ) + sin( radians((SELECT lat FROM places WHERE place_id=1)) ) * sin( radians( lat ) ) ) ) < 25;
这工作正常,但是有两个相同的子查询
SELECT lat FROM places WHERE place_id=1
是否可以优化此查询,使其不具有两个相同的子查询,而是将它们变为 1?
最佳答案
您的三个子查询将为外表中的每一行执行。
您可以做的是将这些子查询转换为单个 JOIN
,该查询只会对整个查询执行一次,以便查找 place_id 1
的纬度和经度:
SELECT a.*
FROM places a
JOIN (SELECT lat, lon FROM places WHERE place_id = 1) b ON
(3959 * acos( cos( radians(b.lat) ) * cos( radians( a.lat ) ) * cos( radians( a.lon ) - radians(b.lon) ) + sin( radians(b.lat) ) * sin( radians( a.lat ) ) ) ) < 25;
关于mysql - 查询中有两个相同的子查询 - 如何使它们为 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11790613/