2012-03-07 98 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 
------------------------------------------------------------