MySQL去重复保留一条操作

一、查询不重复数据

MySQL有distinct、group by和having等实现查询不重复数据的方法,但实际上它们的实现机制并不完全一致,需根据实际场景选择最优解。

1. Distinct方法

SELECT DISTINCT column FROM table;

该方法适用于筛选单个字段不重复数据的场景,例如:

SELECT DISTINCT name FROM students;

这将返回去重后所有不同的名字。

2. Group By方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ...;

该方法适用于筛选多个字段不重复数据的场景,例如:

SELECT name, age FROM students GROUP BY name, age;

这将返回去重后所有不同的姓名和对应年龄。

3. Having方法

SELECT column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING condition;

该方法适用于筛选多个字段不重复数据并需要指定条件的场景,例如:

SELECT name, age FROM students GROUP BY name, age HAVING COUNT(*) > 1;

这将返回去重后所有重复的姓名和对应年龄。

二、删除重复数据

MySQL可以使用三种方法实现删除重复数据:去重查询+临时表、子查询和自联接。

1. 去重查询+临时表

首先使用去重查询构建一个临时表,再根据临时表的唯一键删除重复行:

CREATE TABLE temp_table SELECT DISTINCT * FROM table;
ALTER TABLE temp_table ADD UNIQUE INDEX unique_index (column1, column2, ...);
DELETE t1 FROM table t1, temp_table t2 WHERE t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

2. 子查询

使用子查询筛选出重复行的主键值,再根据主键值删除重复行:

DELETE FROM table WHERE id IN (SELECT id FROM (SELECT id, column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING COUNT(*) > 1) as temp_table);

3. 自联接

使用自联接查找重复数据的主键值,并根据主键值删除重复行:

DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.column1=t2.column1 AND t1.column2=t2.column2 ...;

三、保留一条重复数据

MySQL中可以使用多种方法保留一条重复数据:使用子查询、临时表、内联接等,具体需根据数据特征和查询效率选取。

1. 子查询

使用子查询筛选出重复行中的最小/最大ID值,并将其余ID值删除:

DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY column1, column2 ...);

2. 临时表

使用临时表构建一份保留一条数据的副本,并将其余数据删除:

CREATE TABLE temp_table SELECT MIN(id) as id, column1, column2, ... FROM table GROUP BY column1, column2 ...;
DELETE t1 FROM table t1 LEFT JOIN temp_table on t1.id=temp_table.id WHERE temp_table.id IS NULL;

3. 内联接

使用内联接查询保留一条数据:

DELETE t1 FROM table t1 INNER JOIN table t2 ON t1.column1=t2.column1 AND t1.column2=t2.column2 ... WHERE t1.id > t2.id;

四、小结

MySQL去重复保留一条数据,常用的方法有查询不重复数据、删除重复数据和保留一条重复数据三种,每种方法有多种实现方式,需根据具体场景选取最优解。

原创文章,作者:JDDR,如若转载,请注明出处:https://www.506064.com/n/136575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JDDRJDDR
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • 如何修改mysql的端口号

    本文将介绍如何修改mysql的端口号,方便开发者根据实际需求配置对应端口号。 一、为什么需要修改mysql端口号 默认情况下,mysql使用的端口号是3306。在某些情况下,我们需…

    编程 2025-04-29
  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • Python磁盘操作全方位解析

    本篇文章将从多个方面对Python磁盘操作进行详细阐述,包括文件读写、文件夹创建、删除、文件搜索与遍历、文件重命名、移动、复制、文件权限修改等常用操作。 一、文件读写操作 文件读写…

    编程 2025-04-29
  • Python代码实现回文数最少操作次数

    本文将介绍如何使用Python解决一道经典的回文数问题:给定一个数n,按照一定规则对它进行若干次操作,使得n成为回文数,求最少的操作次数。 一、问题分析 首先,我们需要了解回文数的…

    编程 2025-04-29
  • Python元祖操作用法介绍

    本文将从多个方面对Python元祖的操作进行详细阐述。包括:元祖定义及初始化、元祖遍历、元祖切片、元祖合并及比较、元祖解包等内容。 一、元祖定义及初始化 元祖在Python中属于序…

    编程 2025-04-29
  • MySQL递归函数的用法

    本文将从多个方面对MySQL递归函数的用法做详细的阐述,包括函数的定义、使用方法、示例及注意事项。 一、递归函数的定义 递归函数是指在函数内部调用自身的函数。MySQL提供了CRE…

    编程 2025-04-29
  • 如何用Python对数据进行离散化操作

    数据离散化是指将连续的数据转化为离散的数据,一般是用于数据挖掘和数据分析中,可以帮助我们更好的理解数据,从而更好地进行决策和分析。Python作为一种高效的编程语言,在数据处理和分…

    编程 2025-04-29
  • Python列表的读写操作

    本文将针对Python列表的读取与写入操作进行详细的阐述,包括列表的基本操作、列表的增删改查、列表切片、列表排序、列表反转、列表拼接、列表复制等操作。 一、列表的基本操作 列表是P…

    编程 2025-04-29

发表回复

登录后才能评论