MySQL MIN 查询不适用于计算距离

Posted

技术标签:

【中文标题】MySQL MIN 查询不适用于计算距离【英文标题】:MySQL MIN query not working for calculated distance 【发布时间】:2019-07-06 17:41:40 【问题描述】:

我的数据库中有一个位置表。我需要一个查询来找出最近的位置,提供任何坐标。我编写了以下查询来获取所有行,以及它们与给定坐标的距离(以米为单位的距离):

SELECT *, 111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) * COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance FROM offer dest;

它给出以下输出:

+----+------------------------+----------+-----------+------------+---------------------+
| id | description            | latitude | longitude | name       | distance            |
+----+------------------------+----------+-----------+------------+---------------------+
|  2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 |   1278.565430298969 |
| 12 | Location 2 Description | 8.584711 | 76.868738 | Location 2 | 0.35494725284463646 |
+----+------------------------+----------+-----------+------------+---------------------+

一切正常。现在为了得到最小距离,我在这个查询中添加了HAVING MIN(distance)。现在查询如下所示:

SELECT *, 111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) * COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance FROM offer dest having MIN(distance);

现在,这个查询应该返回 1 行并且应该是位置 2,因为它具有最小位置,但它返回的是位置 1,如下所示:

+----+------------------------+----------+-----------+------------+---------------------+
| id | description            | latitude | longitude | name       | distance            |
+----+------------------------+----------+-----------+------------+---------------------+
|  2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 |   1278.565430298969 |
+----+------------------------+----------+-----------+------------+---------------------+

为什么会这样?我的查询有问题吗?如果是,它是什么以及如何以最小距离获得位置。

【问题讨论】:

【参考方案1】:

HAVING-clause 用于过滤组的条件。在SELECT-part 和GROUP BY 中使用聚合函数定义组。因为你没有这两个,你不应该使用HAVING

如果您想显示与一组行的最小距离,按距离排序并将结果集限制为一行。

SELECT *, 
  111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) *
  COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + 
  SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance
FROM offer dest 
ORDER BY distance
LIMIT 1;

【讨论】:

以上是关于MySQL MIN 查询不适用于计算距离的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询不适用于 NOT IN

媒体查询不适用于 Firefox

媒体查询不适用于移动设备 - 电话

MySQL 查询适用于 SELECT 但不适用于 UPDATE 语句

为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?

MySQL 查询适用于 Workbench,但不适用于 C# 代码