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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
方法1:( e# a9 f. w$ I" r$ W' s1 t7 W
1、创建一个临时表,选取需要的数据。
& w2 _( j. \- A8 L2、清空原表。  [" g  X, r3 C
3、临时表数据导入到原表。
+ k( Z& t4 x7 X4 q' T) F; b2 N4 Q4、删除临时表。! K/ q1 y! Q4 L) ^2 }; N
mysql> select * from student;: I5 V7 J, x3 k- \  ]# w* x
+----+------+
8 L4 G  [, J+ [$ a6 q# B| ID | NAME |
: b" T+ m% ~& E+----+------+
8 _4 f& \- b8 a1 O* r5 B* M| 11 | aa |  }" y, m# Q8 |/ ^" u$ ?
| 12 | aa |
$ X/ p7 S7 t7 N6 o! m' s+ L| 13 | bb |
6 s1 y1 D" a& B9 ^+ y5 i! W( V| 14 | bb |3 A+ A/ l) R, z2 `: N. Q- p
| 15 | bb |
% K2 X3 F$ z5 z- }| 16 | cc |
# B' B6 o8 V5 b' H* l+----+------+
8 _8 F9 b* v/ r# V6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;6 A: E. t" b+ U) [7 W4 ~# n
Query OK, 3 rows affected
5 ~) A0 Z/ B, `7 x% [Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;" R: n" c' A" @1 \
Query OK, 0 rows affected
mysql> insert into student select * from temp;
& j' K* i: R/ B) X" }( B; c  NQuery OK, 3 rows affected( G5 [/ i  s$ z! i6 X" f
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;- k* V" }5 ~% Z; t8 [
+----+------+
; c/ U7 z2 u( o0 I  i| ID | NAME |: N5 W- R8 u* v1 D
+----+------+
( a1 F9 s& h6 p" I  b4 L& `| 11 | aa |
- `6 F/ F; t3 g( e  S( a| 13 | bb |: Q6 m% s2 s% H0 ~7 G2 q2 r
| 16 | cc |
. {( K. k* {. |5 w+----+------+2 b" e3 d. ~, t% H/ x% k1 X
3 rows in set
mysql> drop temporary table temp;
* W. x* z0 x  \; {Query OK, 0 rows affected; C% b+ U  C5 q+ W7 n
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
2 B$ ~- w0 |- R9 V; Hmysql> create temporary table temp as select min(id) as MINID from student group by name;
: W/ m) i6 `4 CQuery OK, 3 rows affected0 h: U: C1 o- h- f" L' w# W' r1 ?
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);3 R: u7 X7 Z. a" @6 U, z
Query OK, 3 rows affected
mysql> select * from student;0 g3 l8 {  L3 d6 r3 z) F, K3 r
+----+------+5 U6 ^# H2 I: l) z0 S6 G1 F1 S
| ID | NAME |) E6 k5 \. M3 Y. Z( k" j! Z% g
+----+------+( S8 ^: |2 c: p) b, E
| 11 | aa |
  e3 ^) x5 U4 E| 13 | bb |# Y: ^; O& y: a) t
| 16 | cc |
# ~3 {& n/ Q( u. g! I4 i+----+------+
/ |( R& f" E( y+ S3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);& O1 K3 r$ }+ b5 R
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& N, J/ k& A# b9 ]6 b( B原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 c* k! J  L- A: [怎么规避这个问题?
( t# S- e- v. T% N" v+ K再加一层封装,如下:5 P/ q# h) U0 I. C& U" h& N
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
3 I9 y; q- \* _& K$ C! bQuery OK, 3 rows affected
mysql> select * from student;" M. M3 r9 L) I  S) A, m
+----+------+
- R% n5 ]: H5 b0 g" k, M| ID | NAME |* c- r' {8 ~2 Z
+----+------+
% p6 [3 G) E' V7 B8 O+ r" i| 11 | aa |7 X; X/ T/ }* p, x4 i3 i
| 13 | bb |
  M+ |( e* }" ~+ u9 _| 16 | cc |. [; J) s) n0 y6 _5 t
+----+------+
$ Z7 x; d2 j6 K' Q3 rows in set

( A7 y" o/ _- X+ i8 k$ [! H' r方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
' d0 ^2 t" U+ B7 V
+ z1 m& F( h$ q  S! c/ w0 H. |2 o, O: |3 x! u) a$ t$ A
回复

使用道具 举报

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

本版积分规则

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