扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
可以看到表中的value字段有重复,如果想筛选去重,使用select distinct语句如下:
目前成都创新互联公司已为上千的企业提供了网站建设、域名、雅安服务器托管、网站托管维护、企业网站设计、阿瓦提网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
得到结果会是
| value
| a
| b
| c
| e
| f
筛选去重是实现了,可是只有选中的value列显示了出来,如果我想知道对应的id呢?
尝试一下把id字段加入sql语句,如下:
得到结果:
| value | id
| a | 1
| b | 2
| c | 3
| c | 4
| e | 5
| f | 5
更换一下sql语句中id和value的顺序,如下:
得到结果:
| id |value
| 1 | a
| 2 | b
| 3 | c
| 4 | c
| 5 | e
| 5 | f
好像看明白它的作用结果了,只有id和value两个字段同时重复时,select distinct语句才会把它列入“去重”清单
所以能看到id为3和4的value虽然都是4,但由于select语句中写了id字段,它也默认会对id字段起效。
而且如果sql语句中把DISTINCT放到只想起效的字段前,那也是不行的....比如sql语句改为:
会提示sql报错。
那到底怎么样能得到我想要的只对value字段内容去重,显示结果又能保留其他字段内容呢....
找到的解决方法是使用group by函数,sql语句如下:
得到结果:
| min(id) |value
| 1 | a
| 2 | b
| 3 | c
| 5 | e
| 5 | f
完成目标了✔!
如果把sql语句中的min()换成max()呢?
得到结果:
| min(id) |value
| 1 | a
| 2 | b
| 4 | c
| 5 | e
| 5 | f
也完成目标了✔!
同时比对两次sql运行结果可以发现,
第一次使用min(id)时,由于重复结果存在两条而id最小的为为3,符合min(id)的筛选条件,所以结果中把id等于4的重复记录删除了。
第二次使用max(id)时结果中,也就把id等于3的重复记录删除了
可以推论到假如还存在一条id=5,value=c的记录,使用max(id)时得到的结果里就会是5 c这条了。
再来尝试一下,如果min()和max()用在value字段里呢:
得到结果:
| id |min(value)
| 1 | a
| 2 | b
| 3 | c
| 4 | c
| 5 | e
得到结果:
| id |min(value)
| 1 | a
| 2 | b
| 3 | c
| 4 | c
| 5 | f
再仔细想想,这种需求也只出现在不是那么care显示结果中,非去重目标字段的内容时才能使用,如果需要指定这些字段的值,可能筛选条件就不是min()和max()那么简单了....
以上。
-------------------部分字段重复---------------------
--1.加索引的方式
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
Alter IGNORE table test_2 add primary key(id);
select * from test_2;
+----+-------+
| id | value |
+----+-------+
| 1 | 2 |
| 2 | 3 |
+----+-------+
我们可以看到 1 3 这条记录消失了
我们这里也可以使用Unique约束 因为有可能列中有NULL值,但是这里NULL就可以多个了..
--2.联合表删除
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
delete A from test_2 a join (select MAX(value) as v ,ID from test_2 group by id) b
on a.id=b.id and a.valueb.v;
select * from test_2;
+------+-------+
| id | value |
+------+-------+
| 1 | 3 |
| 2 | 3 |
+------+-------+
--3.使用Increment_auto也可以就是上面全部字段去重的第二个方法
--4.容易错误的方法
--有些朋友可能会想到子查询的方法,我们来试验一下
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
delete a from test_2 a where exists(select * from test_2 where a.id=id and a.valuevalue);
/*ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause*/
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
不建议直接删除,养成良好的习惯(删除更麻烦),以下是将去重后的数据转移到另一张表代码:
Insert into 表名(列名)select distinct 列名 from 表名
你可以按照去重的思路,删除重复数据
MySQL 删除重复数据
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。
本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。
删除重复数据
如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:
from 树懒学堂 - 一站式数据知识平台
当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
利用group by
代码如下:
SELECT * FROM(
select * from customer where user=(
SELECT source_user from customer WHERE user='admin') UNION ALL select * from customer where user=(
select source_user from customer where user=(
SELECT source_user from customer WHERE user='admin')) union ALL select * from customer where user=(
select source_user from customer where user=(
select source_user from customer where user=(
SELECT source_user from customer WHERE user='admin'))) UNION ALL select * from customer where source_user=(/*我的上线的上线的user*/
select user from customer where user=(
select source_user from customer where user=(
SELECT source_user from customer WHERE user='admin'))) union all select * from customer where source_user=(/*我的上线的上线的上线user*/
select user from customer where user=(
select source_user from customer where user=(
select source_user from customer where user=(
SELECT source_user from customer WHERE user='admin'))))) as alias group by user;
SELECT
DISTINCT name,MAX(score) AS score,MIN(time) AS Time
FROM tb_data
GROUP BY name
ORDER BY time DESC
--DISTINCT()去重
--MAX(score)取得最高成绩
--MIN(time)取得最短用时
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流