簡體   English   中英

無法理解在mysql查詢中使用聚合函數的結果

[英]unable to understand the results of using aggregate function in mysql query

我的數據庫中有一個名為cities的表,其中包含id,name,country_id,lat(緯度)和lng(經度)。 在我的應用程序中,我獲取用戶的位置,然后嘗試找出哪個城市最接近用戶的位置,所以一開始我做了這樣的事情:

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 |
+----+------------------+------------+---------------+---------------+----------------------+

正如您在結果“Alexandria”中看到的那樣,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;

嘗試這個:

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

您只需在第一個查詢中執行訂單即可獲得結果

使用聚合函數時,必須使用GROUP BY語句正確指定任何非聚合字段,否則最終會得到未指定的結果,這通常是聚合排序規則中使用的第一個或最后一個記錄。

MIN(...)並不意味着從表中返回最小值,它表示當前組的最小值,由前導字段和GROUP BY語句指定。 如果你想要整個表的最小值和其他記錄,你需要使用ORDER BY來獲得最低記錄,正如Joe G Joseph所做的那樣,或者像你所做的那樣做並告訴它匹配子查詢通過沒有分組字段獲得整個表的MIN(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM