2012-03-07 101 views
1

我的MySQL表country_phone_codes看起来像这样MySQL查询使用DISTINCT关键字

id  country_code  area_code  name 
------------------------------------------------------------ 
1 | 93   | 93   | AFGHANISTAN 
2 | 93   | 9370  | AFGHANISTAN - MOBILE 
3 | 93   | 9375  | AFGHANISTAN - MOBILE 
4 | 355   | 355  | ALBANIA 
5 | 355   | 35568  | ALBANIA - MOBILE - AMC 
6 | 213   | 213  | ALGERIA 
7 | 213   | 2131  | ALGERIA - CAT 
------------------------------------------------------------ 

这些只是超过28000条记录几个记录。我试图制定一个查询,将提供给我的结果就像这 -

country_code name 
----------------------------- 
93   | AFGHANISTAN 
355   | ALBANIA 
213   | ALGERIA 
----------------------------- 

通过使用SELECT DISTINCT(country_code) FROM country_phone_codes ORDER BY country_code LIMIT 0,260,我能得到不同的国家代码。但是,我如何获得相应的国家名?

+0

如果您在使用前几个答案中提到的查询,你会随机获得例如代码#93的“AFGHANISTAN”或“AFGHANISTAN - MOBILE”。 – 2012-03-07 06:39:55

+0

@SalmanA,对SQL来说可能是真的,但对于这个问题所涉及的MySQL来说可能不是这样。 – danorton 2012-03-07 06:49:15

+1

@danorton:* true *表示MySQL,不适用于需要完整分组的其他数据库。当在GROUP BY中不存在的选择列表中指定列时,MySQL将愉快地返回它在分组行中找到的任何值。当你预计'AFGHANISTAN'时,它可能会返回'阿富汗 - 移动'。 [参考文献](http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)。 – 2012-03-07 06:57:36

回答

3

答案是微不足道的,用GROUP BY

SELECT country_code,MIN(name) 
FROM country_phone_codes 
GROUP BY country_code; 

DISTINCT功能和ORDER BY不需要GROUP BY。由于原来的问题专门pertained到MySQL的MIN()聚合函数是没有必要的,如果你可能会看到更好的性能,而这一切的下列条件:

  • 服务器是MySQL的
  • 存储引擎InnoDB
  • 示例数据的第一列是主键,条目遵循小样本建议的相同排序,即国家名称出现在组中的所有其他名称之前。

这是可行的,因为InnoDB存储引擎将按照主键的顺序进行扫描,对于非聚集列,它将使用它找到的第一个值。

+0

尽管这是MySQL中使用'name'的工作查询,这里不允许使用,因为您没有a)'GROUP BY名称'或者b)使用'max(name)作为名称'的聚合函数。 – Basti 2012-03-07 06:40:49

+1

同样,在给定数据的情况下,DISTINCT也没有意义。 MAX()完全不相关。 – danorton 2012-03-07 06:45:47

+1

在标准SQL中,如果您执行了“GROUP BY”,则只允许使用“GROUP BY”状态中的列或您使用了聚合函数的列。如果你不关心女巫的价值,或者你知道他们都是一样的(通过一些隐含的函数依赖),你可以选择“任何(名字)”。 MySQL不提供这个聚集函数,所以使用'MAX(name)'代替。 – Basti 2012-03-07 06:51:52

0

你需要将你的country_code分组,然后&然后只有你会得到正确的匹配结果。

SELECT country_code,name 
FROM country_phone_codes 
group by country_code 
ORDER BY country_code 

而且我们应该避免在select子句中使用Distinct,因为它会带来性能问题。 取而代之的是,我们可以使用group by

+0

虽然这是MySQL中使用'name'的工作查询,这里不允许,因为你没有a)'GROUP BY name'或b)使用像'max(name)作为名字'这样的聚合函数。 – Basti 2012-03-07 06:40:40

+0

如果您使用的是oracle,它将无法工作。对于MySQL它会工作。这个答案适用于MYSQL,他询问 – Java 2012-03-07 06:42:43

+0

@Basti:不幸的是,它确实有效(当ONLY_FULL_GROUP_BY设置为off时,这是默认设置),尽管它不是标准的SQL。 – 2012-03-07 06:43:33

3

要选择不同的COUNTRY_CODE,名对:

select country_code, name 
from country_phone_codes 
where country_code = area_code; 
0

你似乎要选择那些行,其中的AREA_CODE是一样的COUNTRY_CODE,你可以只选择那些AREA_CODE和COUNTRY_CODE相等行:

SELECT country_code, name 
FROM country_phone_codes 
WHERE area_code = country_code; 

如果有可能,有多行具有相同的区号和国家代码,您可以使用DISTINCT为每个(country_code,name)元组选择一行。

SELECT DISTINCT country_code, name 
FROM country_phone_codes 
WHERE area_code = country_code; 
0

好像你在country_code和name之间有一对多的关系。

如果你做一个简单的GROUP BY查询像

SELECT country_code,name FROM country_phone_codes GROUP BY country_code 

,你可能最终与

country_code name 
----------------------------- 
93   | AFGHANISTAN 
355   | ALBANIA 
213   | ALGERIA 
124   | COUNTRY - MOBILE 
----------------------------- 

假设你所有的国名是

COUNTRY 
COUNTRY - SOMETHING 
COUNTRY - SOMETHING - SOMETHING 

会更好用

SELECT country_code,MIN(name) FROM country_phone_codes GROUP BY country_code 

所以你最终

country_code name 
----------------------------- 
93   | AFGHANISTAN 
355   | ALBANIA 
213   | ALGERIA 
xxx   | COUNTRY 
----------------------------- 

这是假设你在你的表同时拥有这些记录

id  country_code  area_code  name 
------------------------------------------------------------ 
xx | xxx   | xx  | COUNTRY 
xx | xxx   | xx  | COUNTRY - SOMETHING 
------------------------------------------------------------