1

我的数据库中有一个名为ities 的表,其中包含 id、name、country_id、lat(latitude) 和 lng(longitude)。在我的应用程序中,我获取了用户的位置,然后尝试找出离用户位置最近的城市,所以起初我做了这样的事情:

select * , ( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities

返回的结果如下:

+----+------------------+------------+---------------+---------------+----------------------+
| id | name             | country_id | lat           | lng           | min_dis              |
+----+------------------+------------+---------------+---------------+----------------------+
|  1 | Cairo            |         61 | 30.0444196000 | 31.2357116000 |   1.7642055948326205 |
|  2 | Alexandria       |         61 | 31.2000924000 | 29.9187387000 | 0.012723270627083274 |
|  3 | Tanta            |         61 | 30.7865086000 | 31.0003757000 |   1.1707286078440424 |
|  7 | North Coast      |         61 | 28.0488161000 | 34.4371483000 |    5.521208240105792 |
|  8 | Marsa Matruh     |         61 | 31.3543445000 | 27.2373159000 |    2.673858069059212 |
|  9 | Hurghada         |         61 | 27.2578957000 | 33.8116067000 |    5.552079415567052 |
| 10 | Ismailia         |         61 | 30.5964923000 | 32.2714587000 |   2.4415049795085366 |
| 11 | Ain ElSokhna     |         61 | 29.5927778000 | 32.3416667000 |    2.920079170546876 |
| 12 | El Mansoura      |         61 | 31.0409483000 | 31.3784704000 |    1.480587078948432 |
+----+------------------+------------+---------------+---------------+----------------------+

正如您在结果“亚历山大”中看到的那样,ID=2 的城市是最接近用户位置的城市。

当我尝试这样的事情时:

select MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;

我明白了:

+----------------------+
| min_dis              |
+----------------------+
| 0.012723270627083274 |
+----------------------+

这对我来说很有意义......但是当我尝试这个时:

select * , MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;

我明白了:

+----+-------+------------+---------------+---------------+----------------------+
| id | name  | country_id | lat           | lng           | min_dis              |
+----+-------+------------+---------------+---------------+----------------------+
|  1 | Cairo |         61 | 30.0444196000 | 31.2357116000 | 0.012723270627083274 |
+----+-------+------------+---------------+---------------+----------------------+

返回的 min_dis 是正确的,但城市数据不正确!我认为它应该返回“亚历山大”的记录,但它没有..有谁知道为什么?

编辑: 这个查询对我有用:

SELECT `cities`.* FROM `cities` WHERE ((sqrt(pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2)))= (SELECT MIN((sqrt(pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2)))) AS min_id FROM `cities` ))

并返回:

+----+------------+------------+---------------+---------------+
| id | name       | country_id | lat           | lng           |
+----+------------+------------+---------------+---------------+
|  2 | Alexandria |         61 | 31.2000924000 | 29.9187387000 |
+----+------------+------------+---------------+---------------+

我只想了解为什么这个查询不起作用?

select * , MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
4

2 回答 2

2

试试这个:

select * , ( sqrt( pow(lat - 30.4990 , 2) + pow(lng - 29.4435 , 2) ) ) 
                                                    as min_dis 
from cities 
order by sqrt( pow(lat - 30.4990 , 2) + pow(lng - 29.4435 , 2) ) 
limit 1

您只需在第一个查询中进行 order by 即可获得结果

于 2012-08-02T09:21:09.477 回答
1

当您使用聚合函数时,必须使用语句正确指定任何非聚合字段GROUP BY,否则您将得到未指定的结果,这通常是聚合排序规则中使用的第一条或最后一条记录。

MIN(...)并不意味着从表中返回最小值,它意味着当前组的最小值,由前导字段和GROUP BY语句指定。如果您想要整个表的最小值以及其他记录,您确实需要使用 anORDER BY来获取最低记录,就像上面Joe G Joseph所做的那样,或者像您所做的那样做并告诉它匹配一个子查询由于MIN(...)没有分组字段,整个表的 。

于 2012-08-02T10:06:35.037 回答