数据库查询结果去重
介绍MySQL中的去重操作方法,并举例说明。
1.1 使用distinct去重
distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。
- distinct【重复的字段名】,必须放在要去重的重复字段名的开头,即放在第一个参数;
- 只能在查询语句中使用;
- distinct表示对查询字段取不重复的记录,即查出的每行记录都是唯一的;
- 不能与all同时使用,默认情况下,查询时返回的就是所有的结果。
distinct使用:
- 单列数据
SELECT DISTINCT id from A//对A表中的id去重
- 多列数据
SELECT DISTINCT id,name FROM A//对A表中的id和name去重
- 结合count
SELECT count(DISTINCT name) from A//对A表中不同的名字计数
1.2 使用group by去重
group by通常根据一个或多个列对结果集进行分组。
- GROUP BY 【重复的字段名】
- 在分组的列上通常与count、sum、Avg等聚合函数一起使用
1.3 例题解析
题目(Leetcode原题)
Views表:
此表可能会存在重复行(即该表没有主键)此表中的每一行都表示某人在某天浏览了某位作者的某篇文章。请注意,同一人的author_id和viewer_id是相同的。
请查询出所有浏览过自己文章的作者,结果按照id升序排列。
输入的Views表为:
解题思路
- 判断何种情况为浏览过自己文章的作者:当author_id=viewer_id时
- 查询结果后作者的id有重复,需要进行去重操作
-
distinct
Select DISTINCT(author_id) as id FROM Views WHERE author_id=viewer_id ORDER BY author_id ASC 执行时间:90ms
-
group by
Select author_id as id FROM Views WHERE author_id=viewer_id GROUP BY author_id ORDER BY author_id ASC 执行时间:206ms
注意:针对distinct和group by关于去重性能的比较:当重复量较多时,group by的处理效率相对更高一点;当重复量低时,distinct的处理效率更快一点。SQL去重用distinct还是group by
-
- 按照id进行升序排列: order by 字段名 asc(升序/desc降序)