2012-04-02 36 views
1
INSERT INTO geo (city, country, latitude, longitude) 
SELECT ansiname, country_code, latitude, longitude 
FROM geonames2 
WHERE country_code='HK'; 

以下語句正常工作,'ansiname'列中有重複項。MySQL Select許多不同的一列

含義可以有幾個同名的城市名稱,但緯度/長度不同。

HK Kowloon 25.6225  56.2225 
HK Kowloon 24.80388 56.19449 

有沒有辦法改變這個查詢,所以它只會選擇(因此插入)每個ansiname的一個實例?因此下降第二(與差異經/長)。

我更新了SELECT爲失敗如下:

SELECT DISTINCT(ansiname), country_code, latitude, longitude 

THX

+0

您是否在此表上有明確的ID列?否則,這將是一個非常困難的問題來回答 – Churk 2012-04-02 22:03:40

+0

是的是有一個獨特的ID列。 – Adam 2012-04-02 22:06:10

回答

2

可以使用GROUP BY clause來實現:

INSERT INTO geo (city, country, latitude, longitude) 
SELECT ansiname, country_code, MAX(latitude), MAX(longitude) 
FROM geonames2 
WHERE country_code='HK' 
GROUP BY ansiname, country_code 

注:默認情況下,MySQL不要求如果沒有在GROUP BY中列出,則將經度和緯度放入一個聚合函數(MAX)中,但此設置爲可配置e並且可以因服務器而異...因此,包含聚合函數以避免任何潛在錯誤是一種很好的做法。


編輯:與我的建議方法上面的問題是,它分裂拉特/長。既然你在你的表中的ID列,您可以選擇每一個ansinamecountry_code組合單一ID,再拉,結果爲ID

INSERT INTO geo (city, country, latitude, longitude) 
SELECT ansiname, country_code, latitude, longitude 
FROM geonames2 
WHERE Id IN (
    SELECT MAX(Id) 
    FROM geonames2 
    WHERE country_code='HK' 
    GROUP BY ansiname, country_code) 
+0

那是不行的,因爲現在你有一個城市/國家和拉特/長之間的斷開 – Churk 2012-04-02 21:52:34

+0

這不是一個很好的解決方案。例如,如果有一個座標爲「(25.0,56.9)」和「(25.8,55.0)」的城市,則結果爲「(25.8,56.9)」。 'geonames2'表中不存在一行結果。 – 2012-04-02 23:00:15

+0

......這很可能是**對外(或其他不規則)形狀的城市的城市範圍之外的**。 – 2012-04-02 23:07:06

2
INSERT INTO geo (city, country, latitude, longitude) 
SELECT ansiname, country_code, latitude, longitude 
FROM geonames2 
WHERE id IN (select id FROM table WHERE country_code='HK' GROUP BY geonames2, country_code) 

子選擇應該返回你的ID名稱/國家代碼對的第一個實例

+0

+1對於使用Id ...這應該是被接受的答案。 – 2012-04-02 23:35:45