在mysql去除重复记录的方法有很多,同时mysql还带了一个DISTINCT关键字就可以了,下面我来给大家详细介绍介绍去除重复记录sql语句吧,有需要了解的朋友可参考.
SQL SELECT DISTINCT 语句
语法:SELECT DISTINCT 列名称 FROM 表名称使用 DISTINCT 关键词
如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:
SELECT Company FROM Orders
如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句,代码如下:
SELECT DISTINCT Company FROM Orders
下面先来看看例子:
- table
- id name
- 1 a
- 2 b
- 3 c
- 4 c
- 5 b
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多,比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录,代码如下:
select distinct name from table
得到的结果是:
- name
- a
- b
- c
好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧,代码如下:
select distinct name, id from table
结果会是:
- id name
- 1 a
- 2 b
- 3 c
- 4 c
- 5 b
distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除,突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗?
赶紧用count函数一试,成功,我想哭啊,费了这么多工夫,原来就这么简单,现在将完整语句放出,代码如下:
select *, count(distinct name) from table group by name
结果:
- id name count(distinct name)
- 1 a 1
- 2 b 1
- 3 c 1
最后一项是多余的,不用管就行了,目的达到,唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧,对了,还有容容那家伙,现在拿出来希望大家不要被这问题折腾.
哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错,OK了.
补充:经过本人测试 select *, count(distinct name) from table group by name 就可以了.
查找所有重复数据,代码如下:
- /* 查找所有重复数据 */
- SELECT `t1`.*
- FROM `t1`,(
- SELECT `name`,`add`
- FROM `t1`
- GROUP BY `name`,`add`
- HAVING COUNT(1) > 1
- ) AS `t2`
- WHERE `t1`.`name` = `t2`.`name`
- AND `t1`.`add` = `t2`.`add`;
- +
- | id | name | add |
- +
- | 1 | abc | 123 |
- | 2 | abc | 123 |
- | 4 | abc | 123 |
- | 6 | xzy | 456 |
- | 7 | xzy | 456 |
- | 8 | xzy | 456 |
- | 9 | xzy | 789 |
- | 11 | xzy | 789 |
- | 12 | ijk | 147 |
- | 13 | ijk | 147 |
- | 19 | tpk | 963 |
- | 20 | tpk | 963 |
- | 21 | wer | 546 |
- | 22 | wer | 546 |
- +
- rows in set (0.00 sec)
查找除id最小的数据外的重复数据,代码如下:
- /* 查找除id最小的数据外的重复数据 */
- SELECT `t1`.*
- FROM `t1`,(
- SELECT DISTINCT MIN(`id`) AS `id`,`name`,`add`
- FROM `t1`
- GROUP BY `name`,`add`
- HAVING COUNT(1) > 1
- ) AS `t2`
- WHERE `t1`.`name` = `t2`.`name`
- AND `t1`.`add` = `t2`.`add`
- AND `t1`.`id` <> `t2`.`id`;
- +
- | id | name | add |
- +
- | 2 | abc | 123 |
- | 4 | abc | 123 |
- | 7 | xzy | 456 |
- | 8 | xzy | 456 |
- | 11 | xzy | 789 |
- | 13 | ijk | 147 |
- | 20 | tpk | 963 |
- | 22 | wer | 546 |
- +
- rows in set (0.00 sec)
|