找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1727|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:1 Z7 O  V/ ]! h8 t& F. s) q! w
1、创建一个临时表,选取需要的数据。
9 r# g- B# |# P5 C4 s/ [2、清空原表。6 M9 A, d& L5 t* |: w, Y+ s
3、临时表数据导入到原表。  w1 q2 ^" }, G! [; ?& T
4、删除临时表。# Z4 d0 ~* W+ t) d4 p9 }
mysql> select * from student;
2 u- ]: Q' l8 y+ I* N+----+------+- _! L) @  p4 J0 @5 I/ [' p. X
| ID | NAME |
. H2 h: O' d$ L) S+----+------+9 `2 m# y, ]" Y1 J% m$ W/ I
| 11 | aa |! X. d. [4 h2 R* G) C0 Q  A2 W
| 12 | aa |) E: x& v5 _7 f( i
| 13 | bb |
7 X; m2 a" \, m$ W  J4 A& m3 V5 C! n| 14 | bb |
8 q3 i  N! S! d- g| 15 | bb |* w9 B. t8 w& G$ ^% v5 T
| 16 | cc |* w8 N. s. s# c8 V# t2 d1 K- x
+----+------+
' h  ]8 D6 }1 q6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;% h5 U5 P" S/ c% ?1 i" w. N& Y
Query OK, 3 rows affected5 H2 q- ?* U8 V: T' D! ~: p4 z/ f
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;4 }' O3 N7 G6 K+ M: \
Query OK, 0 rows affected
mysql> insert into student select * from temp;$ q' [3 B" X% T, S+ ?& E5 M# g2 c0 {+ x
Query OK, 3 rows affected
1 I; K' j( b5 Y+ Q. ~& M3 a  wRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;) a' m& f5 u" l- [9 `+ o; M
+----+------+
  z' c% A, s4 O7 Q0 || ID | NAME |; l) N6 ~9 g+ V) `8 [4 a
+----+------+
3 G' \6 N' p! ~1 i8 z4 R/ M| 11 | aa |
# B5 }% ?& U+ l+ U| 13 | bb |
2 M" _$ M$ v: }7 R! c! y8 D| 16 | cc |+ }1 M! U& i$ p+ x) ^3 K3 _9 T4 s
+----+------+% f9 k9 V0 E4 [, l
3 rows in set
mysql> drop temporary table temp;
# B, x- E: U: p" H1 l$ wQuery OK, 0 rows affected
5 X' `/ N# N: J这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:" ^% `/ h7 v0 @( |+ a
mysql> create temporary table temp as select min(id) as MINID from student group by name;
* K" |/ V8 {* ]1 ?Query OK, 3 rows affected7 |* S- N! t* v$ `% W2 w
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);6 k/ X% b* q% }7 q/ j- l
Query OK, 3 rows affected
mysql> select * from student;9 d8 g" h  a+ \- j& l6 f
+----+------+
3 y; h9 P9 ~. h| ID | NAME |% e0 j$ e3 O9 E- e0 i2 ^
+----+------+
9 n3 a7 _: ?# g3 v, B| 11 | aa |7 c$ m7 ^1 }$ `- y& x
| 13 | bb |; i6 ~. Y" l; |1 J) X! g7 ?  C
| 16 | cc |
, G. ?4 p. ]/ D$ Z- I6 F% L9 m+----+------+
. P$ i( a3 h/ _! I4 e3 {( V4 e* T3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
/ S" g5 G$ F% @执行报错:1093 - You can't specify target table 'student' for update in FROM clause' C8 H# O  y1 p* U) B
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
& R, t( u6 ^2 H怎么规避这个问题?
/ K% O& ]7 K: P$ ^, K- x% B再加一层封装,如下:& j9 s0 c/ B: E
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);8 R8 b2 B4 b; x6 e, ~
Query OK, 3 rows affected
mysql> select * from student;' A7 |  `: I$ @& m# d' x3 x  t
+----+------+! Q: `3 _% S; |$ d& H+ f1 j
| ID | NAME |* ~* d( A! \7 ?+ V2 B- B
+----+------+
! F5 T. Q8 h* \: J, @0 S* V7 R| 11 | aa |
" s. H! i# f2 R! s! \% D| 13 | bb |
% K2 M+ y$ P0 C* V6 h| 16 | cc |6 F+ s0 N; Z% w4 c
+----+------+/ Z) ^0 R( E8 c1 H
3 rows in set

! W* I2 b1 `* n  ~5 ^, L6 \方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);7 W. ?0 ~% h7 B8 a
* ?' [$ J1 m8 d; }

0 k" C. w5 |, M/ q3 j" \$ i2 i: t5 F
回复

使用道具 举报

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

本版积分规则

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