无法理解mysql查询中使用聚合函数的结果
我在数据库中有一个名为cities的表,其中有id、name、country_id、lat(纬度)和lng(经度)。 在我的应用程序中,我得到了用户的位置,然后尝试找出哪个城市离用户的位置最近,所以首先我做了如下操作:无法理解mysql查询中使用聚合函数的结果,mysql,sql,database,Mysql,Sql,Database,我在数据库中有一个名为cities的表,其中有id、name、country_id、lat(纬度)和lng(经度)。 在我的应用程序中,我得到了用户的位置,然后尝试找出哪个城市离用户的位置最近,所以首先我做了如下操作: select * , ( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities +----+------------------+------------+---------
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 |
+----+------------------+------------+---------------+---------------+----------------------+
select MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
返回如下结果:
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 |
+----+------------------+------------+---------------+---------------+----------------------+
select MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
正如您在结果“Alexandria”city中所看到的,ID=2的城市距离用户的位置最近
当我尝试这样的事情时:
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 |
+----+------------------+------------+---------------+---------------+----------------------+
select MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
我明白了:
+----------------------+
| min_dis |
+----------------------+
| 0.012723270627083274 |
+----------------------+
+----+-------+------------+---------------+---------------+----------------------+
| id | name | country_id | lat | lng | min_dis |
+----+-------+------------+---------------+---------------+----------------------+
| 1 | Cairo | 61 | 30.0444196000 | 31.2357116000 | 0.012723270627083274 |
+----+-------+------------+---------------+---------------+----------------------+
这对我来说很有意义。。。但当我尝试这个:
select * , MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
我明白了:
+----------------------+
| min_dis |
+----------------------+
| 0.012723270627083274 |
+----------------------+
+----+-------+------------+---------------+---------------+----------------------+
| 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;
试试这个:
select * , MIN( sqrt( pow(lat - 31.205 , 2) + pow(lng - 29.907 , 2) ) ) as min_dis from cities;
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即可获得结果当您使用聚合函数时,必须使用
GROUP by
语句正确指定任何非聚合字段,否则您将得到一个未指定的结果,这通常是聚合排序规则中使用的第一条或最后一条记录
MIN(…)
并不意味着从表中返回最小值,而是指当前组的最小值,由前导字段和group by
语句指定。如果您想要整个表的最小值以及其他记录,您需要使用orderby
来获取最小值记录,就像上面的Joe G Joseph所做的那样,或者按照您所做的那样,告诉它匹配获取MIN(…)的子查询由于没有分组字段,所以使用了整个表的
。您的解决方案似乎有效。。但这不是我需要的。当您订购一个集合时,需要O(N logn),但获得最小值只需要O(N),因此使用订单将导致大型数据集的性能不佳。