【MySQL】数据去重

进行数据查询的过程中有些查出来的数据中存在重复的记录,但是我们又不需要重复的数据,而只是需要显示其中的一种就好,这个时候就需要用到数据去重了,数据可以去重,那么我们是否可以在数据出现重复之前提前做一些措施来防止,带着这样的疑问开始了查询答疑之路;

防止数据表出现重复数据

1、数据库表设置时:通过设置主键-PRIMARY Key或者是UNIQUE索引保证数据的唯一性;

设置主键的优点(作用):

  • 加速数据库操作速度
  • 保证实体完整性
  • 防止数据重复,唯一标识一行数据

过滤数据表中的重复数据

1、使用DISTINCT关键字进行重复数据过滤

//使用DISTINCT前
select Name from T_Persons

//使用DISTINCT后效果
select DISTINCT Name from T_Persons

图1使用前数据,图二使用DISTINCT关键字后的数据

在这里插入图片描述    在这里插入图片描述

2、使用GROUP BY读取不重复数据-如上图二

select Name from T_Persons 
GROUP BY Name

项目实战:

表中已经设置了主外键,但是查询出来的字段organization_name存在含义上的重复,具体如下图:

我们猛地看起来这些数据貌似是不重复的,但是其实我需要的只是一条这样的信息就可以啦,这个时候就考虑到了数据去重,于是乎有了下满的代码,根据用户Id进行了去重操作:

	SELECT
	  a.user_name,
	  org.organization_name,
	  r.content,
	  r.total_socre,
		ts.salary	
	FROM
	  `tip_appraise_result` r
	  LEFT JOIN tc_allusers a ON r.appraiser_id=a.id
	  LEFT JOIN tc_allusers b ON b.id =r.user_id
	  LEFT JOIN tc_organization_user o on o.user_id= r.appraiser_id
	  LEFT JOIN tc_organization org ON org.id= o.organization_id
	  LEFT JOIN to_tuition_sum ts on r.appraiser_id=ts.student_id
	WHERE
		EXISTS(
					SELECT DISTINCT id FROM tc_allusers ta
					WHERE  a.id=ta.id
					and a.school_no='666888'
				)

但是发现并没有什么作用,依然顽强的显示上图含义重复信息,经过一番波折,就放弃了上面的查询条件,转换一种解决问题的方式,于是就想着转换后面的查询条件是否可能会得到想要的数据呢,说弄就弄,也就是将上面语句中的查询条件转换成如下的条件进行查询,然后发现出现了自己想要的数据的显示效果;

WHERE
	o.is_delete=0 and org.is_delete=0 and organization_name in
	 (SELECT organization_name FROM tc_organization 
	 WHERE tc_organization.company_id='23VAJAVAXT492QKFsfUBru'AND tc_organization.p_id='NV5onqoiU3Pmf8yojccaCk'AND id<>'7d1rDQbvJchSG58hb3E79V' 
	 AND organization_name<>'流沙河' AND organization_name<>'暂停使用人员')

到此重复数据问题也已经结束,很多时候问题解决不出来,愁的不行,换个角度思考问题,也许没有想象中的那么难,思维也是需要扩散性的;

关于Group By进行去重操作与DISTINCT使用的区别参考:Group By与DISTINCT去重区别

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值