MySQL:排除重复数据

时间:2011-04-01 06:50:11

标签: mysql

在我的一个专栏中,有重复项,我只想抓住第一次出现。我怎样才能做到这一点?在示例中,我想获取col C中唯一的所有行。所以我只想要hello ladieshello teamhello catshello sexy

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 个答案:

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

答案 1 :(得分:2)

使用distinct()命令。

select distinct(colc), cola, colb from table 

这只会选择唯一值

答案 2 :(得分: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转到另一个堆上,依此类推。 COUNT()聚合函数测量这些堆的高度。

HAVING子句是在WHERE之后应用的类GROUP BY条件。我们可以使用它来选择唯一或重复的行,要求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

可以使用带有LIMIT的{​​{1}}的MySQL扩展名删除所有重复行的副本:

DELETE

这将匹配所有DELETE FROM t WHERE colc=3 LIMIT 1 ,但由于colc=3而只会删除一行。