翼度科技»论坛 编程开发 mysql 查看内容

MySQL中去重处理的方法小结

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
在MySQL中,去重通常指的是从查询结果中删除重复的行。这可以通过多种方式实现,具体取决于你的需求。以下是一些常见的去重方法:

1. DISTINCT 关键字:

如果你只是想简单地去重,不关心分组,那么使用 DISTINCT 可能更合适:
使用
  1. DISTINCT
复制代码
关键字可以返回唯一不同的值。
  1. SELECT DISTINCT name  FROM employees;
复制代码
这个查询会返回所有不重复的员工姓名。
  1. SELECT DISTINCT column_name FROM table_name;
复制代码
2. GROUP BY 子句:

使用
  1. GROUP BY
复制代码
子句可以对结果集进行分组,每个组只返回一条记录。
  1. SELECT column_name, COUNT(*)
  2. FROM table_name
  3. GROUP BY column_name;
复制代码
  1. SELECT department_id, name
  2. FROM employees
  3. GROUP BY department_id, name;
复制代码
这个查询会返回每个部门的唯一员工姓名,但请注意,如果部门中有多个人同名,他们都会被列出。

4. 结合 GROUP BY 和 DISTINCT

如果你想先对某个字段进行分组,然后在分组内去重,你可以这样做:
  1. SELECT department_id, DISTINCT name
  2. FROM employees
  3. GROUP BY department_id;
复制代码
但是,这个查询在大多数SQL数据库中是无效的,因为 DISTINCT 应该作用于整个 SELECT 列表,而不是单独的列。

3. 聚合函数:

使用聚合函数(如
  1. MIN()
复制代码
,
  1. MAX()
复制代码
,
  1. SUM()
复制代码
,
  1. AVG()
复制代码
等)也可以实现去重的效果,因为聚合函数会对每个组返回一个值。
  1. SELECT MIN(column_name) AS unique_column
  2. FROM table_name
  3. GROUP BY another_column;
复制代码
4. 子查询:

使用子查询可以创建一个临时表,其中包含唯一的记录。
  1. SELECT *
  2. FROM (
  3.     SELECT DISTINCT column_name
  4.     FROM table_name
  5. ) AS subquery;
复制代码
如果你需要在分组后去重,可以使用子查询:
  1. SELECT department_id, MIN(name) AS name
  2. FROM employees
  3. GROUP BY department_id;
复制代码
这个查询会返回每个部门的员工姓名,但每个部门只返回一个名字(这里使用了 MIN() 函数,实际上 MIN() 和 MAX() 在这种用途下效果相同,因为名字是文本,不是数值)。

5. 临时表:

创建一个临时表来存储去重后的结果。
  1. CREATE TEMPORARY TABLE temp_table AS
  2. SELECT DISTINCT column_name
  3. FROM table_name;

  4. SELECT * FROM temp_table;
  5. DROP TEMPORARY TABLE temp_table;
复制代码
6. 窗口函数(MySQL 8.0+):

使用窗口函数
  1. ROW_NUMBER()
复制代码
,
  1. RANK()
复制代码
,
  1. DENSE_RANK()
复制代码
等可以为每个组分配一个唯一的行号。
  1. SELECT column_name
  2. FROM (
  3.     SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY another_column) AS rn
  4.     FROM table_name
  5. ) AS subquery
  6. WHERE rn = 1;
复制代码
在支持窗口函数的数据库中,你可以使用 ROW_NUMBER() 或 RANK() 来实现更复杂的去重逻辑:
  1. SELECT department_id, name
  2. FROM (
  3.     SELECT department_id, name,
  4.            ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY name) AS rn
  5.     FROM employees
  6. ) t
  7. WHERE t.rn = 1;
复制代码
这个查询会为每个部门的员工按名字排序,并为每个部门的每个名字分配一个行号。外层查询然后选择每个部门的第一个名字,从而实现去重。

7. 使用 GROUP_CONCAT():

如果你想要将重复的行合并成一个字符串,可以使用
  1. GROUP_CONCAT()
复制代码
  1. SELECT column_name, GROUP_CONCAT(another_column SEPARATOR ', ') AS concatenated_values
  2. FROM table_name
  3. GROUP BY column_name;
复制代码
8.使用 DISTINCT ON(MySQL不支持,但适用于其他数据库如PostgreSQL):

在MySQL中没有
  1. DISTINCT ON
复制代码
语法,但这是其他数据库中去重的一种方法。
选择哪种方法取决于你的具体需求,比如你想要保留哪些列,是否需要考虑排序等。在实际应用中,可能需要结合使用多种方法来达到预期的效果。
到此这篇关于MySQL中去重处理的方法小结的文章就介绍到这了,更多相关MySQL 去重处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/331186283.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具