MySQL MIN 查询不适用于计算的距离
MySQL MIN query not working for calculated distance
我的数据库中有 table 个位置。我需要一个查询来找出最近的位置,提供任何坐标。我编写了以下查询来获取所有行,以及它们与给定坐标的各自距离(以米为单位的距离):
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);
现在,此查询应该 return 1 行,并且应该是位置 2,因为它具有最小位置,但这是 returning 位置 1,如下所示:
+----+------------------------+----------+-----------+------------+---------------------+
| id | description | latitude | longitude | name | distance |
+----+------------------------+----------+-----------+------------+---------------------+
| 2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 | 1278.565430298969 |
+----+------------------------+----------+-----------+------------+---------------------+
为什么会这样?我的查询有问题吗?如果是,它是什么以及如何获得最小距离的位置。
HAVING
子句用于过滤组的条件。组在 SELECT
部分和 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;
我的数据库中有 table 个位置。我需要一个查询来找出最近的位置,提供任何坐标。我编写了以下查询来获取所有行,以及它们与给定坐标的各自距离(以米为单位的距离):
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);
现在,此查询应该 return 1 行,并且应该是位置 2,因为它具有最小位置,但这是 returning 位置 1,如下所示:
+----+------------------------+----------+-----------+------------+---------------------+
| id | description | latitude | longitude | name | distance |
+----+------------------------+----------+-----------+------------+---------------------+
| 2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 | 1278.565430298969 |
+----+------------------------+----------+-----------+------------+---------------------+
为什么会这样?我的查询有问题吗?如果是,它是什么以及如何获得最小距离的位置。
HAVING
子句用于过滤组的条件。组在 SELECT
部分和 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;