【问题标题】:Searching for records in database within a certain distance calculated by coordinates通过坐标计算在一定距离内查找数据库中的记录
【发布时间】:2025-12-27 09:40:07
【问题描述】:

我在处理这个查询时遇到了问题:

SELECT Store_name, GPS_latitude, GPS_longitude, SQRT(
POW(69.1 * (GPS_latitude - $longitude), 2) +
POW(69.1 * ($latitude - GPS_longitude) * COS(GPS_latitude / 57.3), 2)) AS distance
FROM table HAVING distance < 25 ORDER BY distance

网站的用户应该能够输入坐标(纬度和经度)。从那里开始,我希望上面的查询列出表中的商店,按它们与给定 $latitude 和 $longitude 的用户的接近程度排序。

我确实得到了结果,但前提是我将查询从“距离

是查询计算错误的方式吗?我很困惑,似乎找不到任何解决方案。

【问题讨论】:

  • 分离查询的每个部分,选择它并查看它是多少,然后将它与应该是多少进行比较。我怀疑这里的任何人现在会坐下来看看你的数学逻辑是否正确。 .
  • @MaxU - 谢谢你的回答。恐怕我没有发现它有帮助。
  • @sagi 谢谢。我对 SQL 不是很熟悉,能否详细说明如何分隔查询的各个部分?
  • 常量 69.1 和 53.7 的含义是什么?

标签: php mysql sql


【解决方案1】:

试试这个:

select * from (
    SELECT Store_name, GPS_latitude, GPS_longitude,
    SQRT(
        POW(69.1 * (GPS_latitude - $longitude), 2) +
        POW(69.1 * ($latitude - GPS_longitude) * COS(GPS_latitude / 57.3), 2)
    ) AS distance
    FROM table
) as vtab
WHERE distance < 25
ORDER BY distance;

PS 但我强烈建议你看看“MySQL-Specific Spatial Relation Functions”

【讨论】:

  • +1 用于使用空间关系函数。一旦您的数据库开始增长,此查询将非常缓慢......
  • @NevilleK,谢谢!我不喜欢“重新发明*”的方法;)