MySQL从许多列中选择不同的一列

MySQL从许多列中选择不同的一列,mysql,Mysql,除了“ansiname”列中有重复项外,以下语句工作正常 这意味着可以有几个城市名称具有相同的名称,但具有不同的lat/long INSERT INTO geo (city, country, latitude, longitude) SELECT ansiname, country_code, latitude, longitude FROM geonames2 WHERE country_code='HK'; 是否有办法更改此查询,使其仅选择并因此插入每个ansiname的一个

除了“ansiname”列中有重复项外,以下语句工作正常

这意味着可以有几个城市名称具有相同的名称,但具有不同的lat/long

 INSERT INTO geo (city, country, latitude, longitude)
 SELECT ansiname, country_code, latitude, longitude
 FROM   geonames2
 WHERE country_code='HK';
是否有办法更改此查询,使其仅选择并因此插入每个ansiname的一个实例?因此,使用diff lat/long删除第二个

 INSERT INTO geo (city, country, latitude, longitude)
 SELECT ansiname, country_code, latitude, longitude
 FROM   geonames2
 WHERE country_code='HK';
我更新了SELECT,如下所示,但未成功:

 HK Kowloon 25.6225     56.2225
 HK Kowloon 24.80388    56.19449
thx

您可以使用来完成此操作:

 SELECT DISTINCT(ansiname), country_code, latitude, longitude
注意:默认情况下,MySql不要求您将纬度和经度放入聚合函数MAX中(如果它未在GroupBy中列出),但此设置是可配置的,并且可能因服务器而异。。。因此,最好包含聚合函数以避免任何潜在错误

编辑:我上面建议的方法的问题是它分割了lat/long。由于表中有一个ID列,因此可以为每个ansiname、country_代码组合选择一个ID,然后提取该ID的结果:

您可以使用来完成此操作:

 SELECT DISTINCT(ansiname), country_code, latitude, longitude
注意:默认情况下,MySql不要求您将纬度和经度放入聚合函数MAX中(如果它未在GroupBy中列出),但此设置是可配置的,并且可能因服务器而异。。。因此,最好包含聚合函数以避免任何潜在错误

编辑:我上面建议的方法的问题是它分割了lat/long。由于表中有一个ID列,因此可以为每个ansiname、country_代码组合选择一个ID,然后提取该ID的结果:

子选择应该返回名称/国家/地区代码对的第一个实例的ID


子选择应该返回名称/国家/代码对的第一个实例的ID,该代码对将不起作用,因为现在城市/国家和纬度/经度之间存在断开连接。这不是一个很好的解决方案。例如,如果有一个城市的坐标为25.0,56.9和25.8,55.0,那么结果将是25.8,56.9。结果在geonames2表中不作为行存在。。。。对于一个有对角线或其他不规则形状的城市来说,这很可能超出了城市的界限。我没有考虑在表中的不同记录之间拆分lat/long。我更新了答案来解决这个问题,但是我的解决方案看起来很像Churk以前的答案…加入可能比选择更快。。。。但是慢而正确的方法总比快而猛烈的错误方法好。这是行不通的,因为现在你的城市/国家和纬度/纬度之间出现了脱节。这不是一个很好的解决办法。例如,如果有一个城市的坐标为25.0,56.9和25.8,55.0,那么结果将是25.8,56.9。结果在geonames2表中不作为行存在。。。。对于一个有对角线或其他不规则形状的城市来说,这很可能超出了城市的界限。我没有考虑在表中的不同记录之间拆分lat/long。我更新了答案来解决这个问题,但是我的解决方案看起来很像Churk以前的答案…加入可能比选择更快。。。。但是慢而正确总比快而猛烈的错误好。你在这张表上有一个不同的ID列吗?否则,这将是一个很难回答的问题。是的,有一个不同的ID列。这个表上有不同的ID列吗?否则,这将是一个很难回答的问题。是的,有一个独特的ID列。
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 )