2011-04-01 92 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,只会删除一行。