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