2012-03-19 70 views
1

的。如果我有一個包含加油站指定城市的名稱和每個加油站的緯度+經度表:SQLite的:獲取一個代表實體對每個組的實體

city  | name   | latitude  | longitude 
--------------------------------------------------------- 
Berlin  | GasPump1  | 52.5   | 13.5 
Berlin  | GasPump2  | 52.52   | 13.51 
Zagreb  | INA1   | 45.8   | 16 
Zagreb  | INA2   | 45.81   | 16.01 
Zagreb  | INA3   | 45.82   | 15.99 

我怎麼會去使用單個SQL查詢爲每個城市獲取單個代表性實體?也就是說,我將如何去使用單個查詢執行以下僞代碼:

representativeStationsArray = [] 
citiesArray = sqlQuery("SELECT DISTINCT city FROM gasstations") 
for city in citiesArray: 
    representativeStation = sqlQuery(
     "SELECT * FROM gasstations WHERE city = ? LIMIT 1;", 
     city) 
    representativeStationsArray.append(representativeStation) 

我已經接受了答案,但我想這可能是有趣的解釋爲未來的讀者我的需求。

在iOS上,一旦用戶縮小,在地圖視圖上顯示的註釋太多會降低應用的速度。我嘗試的第一個實驗性解決方案(對於我正在開發的國家/地區應該沒問題)是按城市過濾註釋,併爲每個城市顯示一個隨機註釋。

如果這證明不令人滿意,我會尋找另一種解決方案。

+2

什麼是「代表」行?你只是想要任意排? – 2012-03-19 17:07:35

+2

目前還不清楚你想要什麼。根據你的代碼,看起來你需要一個包含每個城市任何一個加油站的清單。 – mikerobi 2012-03-19 17:11:42

+0

這是正確的 - 任何任意行。 – 2012-03-19 17:19:08

回答

2

如果「代表一行」你剛纔的意思是「任意行所在城市的比賽」,那麼你可以只使用一個GROUP BY:

SELECT * FROM gasstations 
GROUP BY city 

的比city其他將與從數據填充字段任意組匹配行。

從文檔在http://sqlite.org/lang_select.html#resultset(重點煤礦)

如果SELECT語句是GROUP BY子句彙總查詢...

在結果集中的每個表情然後對每個 組的行進行一次評估。如果表達式是一個聚合表達式,則在組中的所有行上計算該值爲 。 否則,將針對組內的單個任意選擇行評估 。如果 結果集中有多個非聚合表達式,則 則對同一行評估所有這些表達式。

注意:它適用於SQLite和MySQL以及其他一些數據庫。但是很多(大多數?)數據庫不允許您在分組查詢中選擇非聚合字段。因此,如果您切換數據庫或部署到不同的生產數據庫,請注意這一點。

+0

如果我將來需要它,您是否有任何提示查詢每個城市的多個任意選擇的條目? – 2012-03-19 17:35:14

+0

@IvanVučica,這是一個更難的查詢。如果您需要幫助,請將其作爲另一個問題發佈。 (並且在這裏的評論中發佈鏈接到你的新問題 - 如果我有時間,我可以在那裏幫助你,但將它放在這裏是無關緊要的)。 – 2012-03-19 18:12:27

相關問題