mysql - 查询中有两个相同的子查询 - 如何使它们为 1?

标签 mysql subquery

我有座位

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/

相关文章:

mysql - 使用 WHERE 子句时更新 MySQL 中的多行

Mysql子查询优化?

database - 在子查询中获取 Id

mysql - 这些查询是否正确?

mysql - 优化子查询选择每组最后一条记录

mysql - 如何在比较 MySQL 中的两个表后拖动值

MySQL 和 PHPMyadmin - 无法创建关系

mysql - 如何记录所有来自 Go/MySQL 的传出 SQL 语句?

php - MySQL 头痛,我应该还是不应该?

mysql - MySQL 和 Sphinx 混合查询