MySQL选择与众不同的一列

时间:2012-04-02 21:47:11

标签: mysql

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

以下语句正常工作,但'ansiname'列中有重复项。

意思是可能有一些城市名称具有相同的名称,但纬度/长度不同。

 HK Kowloon 25.6225     56.2225
 HK Kowloon 24.80388    56.19449

有没有办法改变这个查询,所以它只会选择(并因此插入)每个ansiname的一个实例?因此放下第二个(使用diff lat / long)。

我更新了SELECT失败如下:

 SELECT DISTINCT(ansiname), country_code, latitude, longitude

THX

2 个答案:

答案 0 :(得分: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不要求您将纬度和经度放入聚合函数(MAX),如果它未在GROUP BY中列出,但此设置是可配置的并且因服务器而异;所以最好包括聚合函数以避免任何潜在的错误。


编辑:上面提出的建议方法的问题是它会分割lat / long。由于您的表格中有ID列,因此您可以为每个IDansiname组合选择一个country_code,然后为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)

答案 1 :(得分: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 )

subselect应该返回name / country_code对的第一个实例的ID