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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
: X; F3 ]) Z0 M% R( d& n- u+ G1、创建一个临时表,选取需要的数据。+ K! E# Y5 P4 i, K: G
2、清空原表。
2 d- F" m/ K! u3、临时表数据导入到原表。, s/ F. l, i+ [8 C; I
4、删除临时表。
9 U! N% ^- Q+ c; omysql> select * from student;# `* Y% o% q5 w8 i5 ]' v1 M2 ^
+----+------+  L1 J6 F; i1 Z0 L# w4 g
| ID | NAME |
% `8 U. B  s( h/ b* P* ]1 }8 R+----+------+# Z. N+ b, t2 \) M3 V3 i: D" J
| 11 | aa |8 d" Z" W  _2 i! e" a
| 12 | aa |
! U: ^1 y. K/ @# P2 O| 13 | bb |
& ], v2 B# ^( T0 T| 14 | bb |
2 u$ Q# h# u" c. B% }8 P| 15 | bb |
" k! ]/ F9 e) `, H# @| 16 | cc |# x2 o/ k7 y' R* F* W
+----+------+  c; M& D0 z; w9 `9 U) g
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
4 q) `5 ~; ]4 \; i5 V1 j5 i% V( }Query OK, 3 rows affected
) `; k; y% q) K* _  U4 ?9 y$ eRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
3 P/ s$ Z4 r, B8 xQuery OK, 0 rows affected
mysql> insert into student select * from temp;
2 s7 M% A/ D, q- ~  r. f7 {* gQuery OK, 3 rows affected
0 p$ A. x( Q! h5 b5 R2 |& q+ JRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
( L/ ]/ I6 J, J# K0 M+----+------+: T0 d5 u$ [6 _$ {0 i. k+ b
| ID | NAME |
2 ~1 W" B, c, n$ ~& D+----+------+6 V: F9 L. Q0 f9 A1 S) D+ r# z
| 11 | aa |7 T( p+ i& ]7 A5 V! q# U( n
| 13 | bb |
9 I) n" G2 h, S) j% |/ ~| 16 | cc |
$ _1 S) V3 W+ c0 s( ]5 z+----+------+1 L& r% l6 m: t: U0 m& [
3 rows in set
mysql> drop temporary table temp;
' D5 S  K! z  J& X7 xQuery OK, 0 rows affected
9 g" D$ m: d& G) J9 E2 L+ V这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
1 O7 V$ d# K6 W4 D9 u6 b5 Cmysql> create temporary table temp as select min(id) as MINID from student group by name;1 D, U+ ~% I- a- }
Query OK, 3 rows affected) t+ n0 i) C8 ?. u. W- {9 P
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);' l+ q9 U0 }5 B% k& v- x7 m5 w
Query OK, 3 rows affected
mysql> select * from student;
8 z4 F% Z, y# Q! ^. k; M2 I+----+------+
4 |* T$ \! }+ F| ID | NAME |
# C( W* P3 L6 }6 P+----+------+6 }  |" ?2 x& {; K- L
| 11 | aa |; H" ]- M8 q1 P  q' s3 @) B
| 13 | bb |
7 ^, Y; s3 b: y) W! I2 L| 16 | cc |4 a+ d. C2 F/ H
+----+------+) ?3 x) B. w$ m
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);/ u: `2 e9 g$ C1 x2 [
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
' y4 t* U$ @9 E4 |  \; \) S* _原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
+ H1 L, S# A% l% r怎么规避这个问题?/ e/ S# P. o/ D; Q- Q
再加一层封装,如下:/ x7 F/ r6 C7 k; E% M% t; H8 M
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
" p5 m+ ^; L( \7 l; U( KQuery OK, 3 rows affected
mysql> select * from student;. a8 S9 H+ a3 n/ E' c
+----+------+
6 ]) W: ?/ M1 ^- a6 k& z& Y+ N| ID | NAME |- u, B* N1 h3 K2 ~5 u4 L
+----+------+
1 `2 E1 L8 b' X1 E3 V: P  s| 11 | aa |8 A- |8 H9 a, w$ o* A
| 13 | bb |) W2 s7 ]' k$ A7 u, e
| 16 | cc |" x/ s; f% w, u7 z6 T
+----+------+
: G4 t- K% K' E0 n0 l3 rows in set
6 T9 _7 h/ y# m, N
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
# |6 m/ c8 W2 q/ i
' T! M8 K7 N8 a. ~" C! ?# `+ X
8 x# N6 L: ?+ g$ Z$ T
回复

使用道具 举报

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

本版积分规则

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