MySQL查詢表內重複記錄並刪除

在平常業務場景中,常常會出現一個問題就是解決數據重複的問題,這裏用到了一張用戶表(s_user)作重複數據操做,分別包含了兩個字段,id、name分別用於作惟一標示以及相同姓名的檢索。sql

表結構以及測試數據測試

/*
Navicat MySQL Data Transfer

Source Server         : 120.25.170.205
Source Server Version : 50173
Source Host           : 120.25.170.205:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 50173
File Encoding         : 65001

Date: 2018-08-13 17:11:24
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for s_user
-- ----------------------------
DROP TABLE IF EXISTS `s_user`;
CREATE TABLE `s_user` (
  `id` varchar(36) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of s_user
-- ----------------------------
INSERT INTO `s_user` VALUES ('a53cb32a-9ed0-11e8-87f3-00163e064c72', '李四');
INSERT INTO `s_user` VALUES ('86badf60-9ea0-11e8-87f3-00163e064c72', '老王');
INSERT INTO `s_user` VALUES ('a50cb058-9ed0-11e8-87f3-00163e064c72', '李四');
INSERT INTO `s_user` VALUES ('8529ce40-9ea0-11e8-87f3-00163e064c72', '老萬');
INSERT INTO `s_user` VALUES ('a2d7d40c-9ed0-11e8-87f3-00163e064c72', '張三');
INSERT INTO `s_user` VALUES ('801528a0-9ea0-11e8-87f3-00163e064c72', '李四');
INSERT INTO `s_user` VALUES ('a313915e-9ed0-11e8-87f3-00163e064c72', '張三');
INSERT INTO `s_user` VALUES ('79a27d1a-9ea0-11e8-87f3-00163e064c72', '張三');

  

小葵花課堂開課了

一、如何經過用戶名檢索出相同的用戶信息對象

select name,count(s.id) from s_user s GROUP BY s.`name`  HAVING count(s.`name`)>1

二、經過用戶名檢索出全部相同的用戶信息並刪除blog

delete from s_user
where name in (SELECT * from(select s.name from s_user s group by s.name having count(name) > 1)s)
and id not in (SELECT id from (select min(s.id)id from s_user s group by s.name having count(name)>1)a)

注意事項:因爲子查詢限制,若是子查詢的 from 子句和更新、刪除對象使用同一張表則須要在子查詢外添加一個查詢,不然會出現如下錯誤:ci

[Err] 1093 - You can't specify target table 's_user' for update in FROM clause

錯誤的查詢:get

delete from s_user
where name in (select s.name from s_user s group by s.name having count(name) > 1)
and id not in (SELECT id from (select min(s.id)id from s_user s group by s.name having count(name)>1)a)

正確的查詢:io

delete from s_user
where name in (SELECT * from(select s.name from s_user s group by s.name having count(name) > 1)s)
and id not in (SELECT id from (select min(s.id)id from s_user s group by s.name having count(name)>1)a)
相關文章
相關標籤/搜索