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
答案 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列,因此您可以为每个ID
,ansiname
组合选择一个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