找回密码
 立即注册
查看: 2944|回复: 0
打印 上一主题 下一主题

mysql删除重复记录,保存Id最小的一条

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
7 ~& c6 g8 [* T4 f: Q1、创建一个临时表,选取需要的数据。$ x1 e) q' _3 b' R/ ~
2、清空原表。
9 [7 I( j  K8 g" e* M! X3、临时表数据导入到原表。
0 m: P, ]: p( s6 Z$ Q2 [3 V# N4、删除临时表。5 M: a; j4 u3 V* I, K
mysql> select * from student;. a- I  y3 I: i& {5 s) C
+----+------+' J. \0 `7 T! n8 W
| ID | NAME |6 V: w9 ^! P  D- [& |0 U) U! |
+----+------+
  s* Y; @4 M8 ]| 11 | aa |5 R7 s& `, d9 \
| 12 | aa |/ ?: S0 k7 o. R. T
| 13 | bb |
. q) P5 i/ E1 p* p| 14 | bb |
: m; l% j8 A& s$ [4 q| 15 | bb |. B% r+ m. g, e6 R5 h
| 16 | cc |/ J4 k- b% S( f) o1 u" I7 [. d5 K) x
+----+------+( H8 p+ Z: i0 B; t! n% `
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
4 k4 F: h* G3 f' h* YQuery OK, 3 rows affected
! {4 P2 U  Y) O" c8 @Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;- h2 z+ l/ Y- e7 f
Query OK, 0 rows affected
mysql> insert into student select * from temp;
2 g: |4 N+ M( f0 C1 a6 f3 p. Z5 m/ s2 PQuery OK, 3 rows affected' _' H$ ^$ i0 v& _8 W! v, |# s- H& O
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;- Y4 W- Y7 U+ g7 @! @% m" \/ Z" o' j: C/ P
+----+------+, N6 B" R7 M) {& g* P0 b# G
| ID | NAME |  J, }* u3 l  g6 [' l% A0 n
+----+------+
2 b2 J  W  r8 @| 11 | aa |, D. l5 t! ^4 @' `6 J
| 13 | bb |
" G* K+ y4 x& F| 16 | cc |
  k( j6 t+ j, _4 D' t+----+------+
4 f% X' U4 j) K# Q( |3 rows in set
mysql> drop temporary table temp;* r; U' y2 N9 I) f
Query OK, 0 rows affected
! y% F! @6 c- _9 K1 M6 ^6 t这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:8 U. Z. [- S& t$ P5 h/ h* r. W- t
mysql> create temporary table temp as select min(id) as MINID from student group by name;
* y( K( Z# d& \; CQuery OK, 3 rows affected
" K( s" X4 L$ y. J7 ?1 RRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
1 v+ l$ c: }6 o$ l$ i( FQuery OK, 3 rows affected
mysql> select * from student;
4 B' y3 w8 K9 }2 a/ Z+----+------+
8 X. L, ]/ t4 v% G4 [1 s! i7 @| ID | NAME |
. r4 U/ X5 w) H- _+----+------+  J4 n* p' l) w! ]* v
| 11 | aa |
. `" T+ S: m" J2 t  B6 _| 13 | bb |% `, @. d" \9 f5 o5 W. a
| 16 | cc |& j/ w/ j1 b, y  }$ }
+----+------+
; I) p4 r& d3 p0 r( W& f2 d4 P3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);; ~: D  m. U+ t' I& j" }, `
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
: t) x0 A, t8 }% x原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
: G0 t* b0 ]7 H. i. ]: H怎么规避这个问题?
" V; t) w3 H  `  i- W/ K再加一层封装,如下:
  A9 y' v' j$ p, R  [4 ]7 l: amysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);" [* x, X5 @1 D
Query OK, 3 rows affected
mysql> select * from student;
& c# v' s( A/ J$ f) i/ h+ q, K! _+----+------+
9 _9 f  c' ~/ t% l3 j7 L| ID | NAME |
' i3 b) {% W5 X9 f8 b! E/ }2 W+----+------++ W! w5 k* D8 a
| 11 | aa |" }  i1 E7 z, @2 C5 g( w8 |
| 13 | bb |  [& l" |% B4 [' M9 S1 [- y
| 16 | cc |6 f9 T7 \' G. W4 m* x% z
+----+------+
- C& `' ^6 L/ S3 rows in set

! N1 D% M( A* y+ W/ M: k0 m方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);3 C5 p6 E7 P+ {7 n( f. \- g

0 {* e/ ^5 W& c8 `- y& n  D* j9 E- v: L0 R4 ~. L9 f4 W
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表