2011-04-01 90 views
1

在我的其中一列中,有重複的內容,我只想抓取第一個匹配項。我怎樣才能做到這一點?在這個例子中,我想抓住一切都在山坳C.獨特的行,所以我只想hello ladieshello teamhello catshello sexyMySQL:排除重複數據

Example Table 
--------------- 

column A | col B | col C 
-------------------------- 
hello | ladies| 1 
hello | guys | 1 
hello | team | 2 
hello | dogs | 2 
hello | cats | 3 
hello | cats | 3 
hello | sexy | 4 

回答

3

DISTINCT關鍵字不適合你的情況。

在DB中,行的順序是任意的。但是,您可以使用可以使用字符串的聚合函數爲每個唯一C值選擇B列中的一個。 MAX是這樣的功能,如果字符串的「最大」是一個可以接受的選擇:

mysql> select A,max(B),C from Test group by C,A; 
+-------+--------+------+ 
| A  | max(B) | C | 
+-------+--------+------+ 
| hello | ladies | 1 | 
| hello | team | 2 | 
| hello | cats | 3 | 
| hello | sexy | 4 | 
+-------+--------+------+ 
4 rows in set (0.00 sec) 
+0

等待,如果我想選擇所有列,這將如何工作?這不是說我必須輸入每一個而不是使用'*'嗎?我試過這個:'SELECT DISTINCT col C,* FROM table' – Strawberry 2011-04-01 07:06:30

+0

http://jan.kneschke.de/projects/mysql/groupwise-max/ – Isotopp 2011-04-03 11:48:47

2

使用不同的()命令。

select distinct(colc), cola, colb from table 

這將只能選擇唯一值

1

隨着LIMIT,你可以得到公正的事情之一,如果有多個的這件事情。此外,如果行完全相同,則根本無法區分它們,因此順序無關緊要。

SELECT * FROM t WHERE colc=3 LIMIT 1 

有時候你想要的重複行的報告:

SELECT colc, COUNT(*) AS cnt FROM t GROUP BY colc 

GROUP BY子句着眼於田野,你的名字(在這裏:colc),並考慮用同樣COLC值的所有行相同。它爲每個colc值創建堆,因此所有colc=1都轉到一個堆上,colc=2轉移到另一個上,等等。集合函數測量這些堆的高度。

A HAVING子句是在GROUP BY之後應用的類似WHERE的條件。我們可以用它來選擇是唯一的或者是重複行,要求cnt爲1或大於1:

-- list all unique rows 
SELECT colc, COUNT(*) AS cnt FROM t GROUP BY colc HAVING cnt = 1 

您可以看到的堆的實際內容:

SELECT colc, COUNT(*) as cnt, GROUP_CONCAT(colb) AS content FROM t GROUP BY colc HAVING cnt > 1 

這是可能的DELETE刪除所有,但使用的LIMIT MySQL擴展的重複行的一個副本:

DELETE FROM t WHERE colc=3 LIMIT 1 

這將匹配ALL colc=3,但由於LIMIT,只會刪除一行。