使用DISTINCT关键字进行MySQL查询

时间:2012-03-07 06:27:33

标签: php mysql

我的MySQL表country_phone_codes看起来像这样

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,我可以获得不同的国家/地区代码。但是如何获得相应的国家名称?

5 个答案:

答案 0 :(得分:3)

要选择不同的country_code,名称对:

select country_code, name
from country_phone_codes
where country_code = area_code;

答案 1 :(得分:3)

答案很简单,使用GROUP BY

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

DISTINCT不需要ORDER BY功能和GROUP BY。由于最初的问题与MySQL有关,因此MIN()聚合函数不是必需的,如果满足以下所有条件,您可能会看到更好的性能:

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

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

答案 2 :(得分:0)

您还需要对country_code进行分组然后&那么只有你会得到正确的匹配结果。

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

我们应该避免在select子句中使用Distinct,因为它会产生性能问题。 而不是我们可以使用group by

答案 3 :(得分: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;

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