加唯一索引时候发现已有重复数据删除

简介: 加唯一索引时候发现已有重复数据删除

说话随便的人,便是没有责任心。——哈代

sql如下

-- 查询重复数据id
SELECT
  GROUP_CONCAT( id SEPARATOR ',' )
FROM
  `my_table` 
GROUP BY
  `user_id`,
  `depart_id`,
  `position_id` 
HAVING
  COUNT(*) > 1 
  AND `user_id` IS NOT NULL
  AND `depart_id` IS NOT NULL
  AND `position_id` IS NOT NULL;
-- 查询需要删除掉的重复数据
SELECT
  t1.`id`,
  t1.`user_id`,
  t1.`depart_id`,
  t1.`position_id`,
  t1.`gmt_create` 
FROM
  my_table t1
  INNER JOIN (
  SELECT
    user_id,
    depart_id,
    position_id,
    MAX( gmt_create ) AS latest_gmt_create,
    MAX( id ) AS latest_id 
  FROM
    my_table 
  WHERE
    user_id IS NOT NULL 
    AND depart_id IS NOT NULL 
    AND position_id IS NOT NULL 
  GROUP BY
    user_id,
    depart_id,
    position_id 
  HAVING
    COUNT(*) > 1 
  ) t2 ON t1.user_id = t2.user_id 
  AND t1.depart_id = t2.depart_id 
  AND t1.position_id = t2.position_id 
  AND ( t1.gmt_create < t2.latest_gmt_create OR t1.id < t2.latest_id );
-- 改为删除sql,执行删除
DELETE
  t1
FROM
  my_table t1
  INNER JOIN (
  SELECT
    user_id,
    depart_id,
    position_id,
    MAX( gmt_create ) AS latest_gmt_create,
    MAX( id ) AS latest_id 
  FROM
    my_table 
  WHERE
    user_id IS NOT NULL 
    AND depart_id IS NOT NULL 
    AND position_id IS NOT NULL 
  GROUP BY
    user_id,
    depart_id,
    position_id 
  HAVING
    COUNT(*) > 1 
  ) t2 ON t1.user_id = t2.user_id 
  AND t1.depart_id = t2.depart_id 
  AND t1.position_id = t2.position_id 
  AND ( t1.gmt_create < t2.latest_gmt_create OR t1.id < t2.latest_id );       
相关文章
|
6月前
|
存储 前端开发 Oracle
物化视图添加删除列测试
物化视图添加删除列测试
48 2
|
关系型数据库 MySQL 索引
mysql索引的创建删除
mysql索引的创建删除
108 0
|
存储 关系型数据库 MySQL
MySql基础-笔记4 -数据表创建、删除和数据插入、查询等操作
MySql基础-笔记4 -数据表创建、删除和数据插入、查询等操作
131 0
MySql基础-笔记4 -数据表创建、删除和数据插入、查询等操作
|
设计模式 数据库
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
测试关于索引的操作- 修改索引
测试关于索引的操作- 修改索引
测试关于索引的操作-创建索引
测试关于索引的操作-创建索引
|
SQL 关系型数据库 MySQL
MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
308 0
MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
|
SQL 关系型数据库 MySQL
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
1502 0
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据