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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:+ c+ a; l& G; a/ k- k# I. W
1、创建一个临时表,选取需要的数据。
/ s* w; J0 y- n- f1 b2、清空原表。1 o8 {  {6 \6 ]& B3 q( m
3、临时表数据导入到原表。
8 s3 L. O6 z3 Z) b9 D4、删除临时表。
+ b. Y; h/ S, a7 o. R, u% r$ jmysql> select * from student;8 d3 {, m0 x2 ?+ {$ O$ O" z( X' `% {0 b
+----+------+
" Q  c3 a4 A- Y- x8 P4 M; n# g| ID | NAME |* _  [2 D9 S, H- O+ Q( x* r; |
+----+------+
: z1 H% m7 S4 f! M0 C+ r| 11 | aa |
4 z6 I2 j) ^+ @5 M: m# v| 12 | aa |4 M% p. H# n7 [
| 13 | bb |: _8 J: o7 L: k4 O) F& ^! q
| 14 | bb |) d; N% N$ B7 a2 n) y8 A  y; Z6 {/ `
| 15 | bb |
7 Y# `, w. Q, N& r* m| 16 | cc |
, X. p4 a: P! H6 ^+----+------+9 R# Y0 M+ I1 U6 m( M5 r! H( d
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;- c9 g$ }; I, Y0 n5 r# i
Query OK, 3 rows affected8 G5 a+ T) ~% ?9 f
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
6 _5 u* l7 }, b% |% `2 LQuery OK, 0 rows affected
mysql> insert into student select * from temp;3 c4 x3 [: E. L, |5 B* @6 q* x
Query OK, 3 rows affected
6 R1 G2 v1 m  s  tRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
# K) I0 d* K4 X0 `+----+------+
  q1 d1 K: ^3 j( ]. e( c3 F| ID | NAME |- N# v/ W5 A3 Z1 C& B
+----+------+5 d' J/ E$ t4 E# `
| 11 | aa |
' X2 M9 o( t& {  r1 [+ d| 13 | bb |! x2 k4 `, p- t4 X% A) u( V
| 16 | cc |
% t' o- n& m* z6 g" V+ J+----+------+
6 `7 K+ Q$ n! \) @3 W3 rows in set
mysql> drop temporary table temp;+ N. D* ]- ]5 G. v* {+ Q
Query OK, 0 rows affected& ~/ h/ x/ [/ }! W/ D( x& s$ `& ?: \9 o$ n5 S
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:  C/ j) m  f2 g2 W  U1 F. s% H3 O
mysql> create temporary table temp as select min(id) as MINID from student group by name;
' B2 T6 r9 D3 @& N% |& d. MQuery OK, 3 rows affected2 z5 [! D' D* o" z7 @& G2 I& D
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);* H+ V: W4 M$ U. z
Query OK, 3 rows affected
mysql> select * from student;8 n7 k. Y9 a. b: V( Z, j
+----+------+9 ~8 m8 ?6 u9 i9 }
| ID | NAME |
) [. j; M% h" I, \( C; b2 p+----+------+" F  n0 Q; X$ Y+ O/ _( X. K
| 11 | aa |
9 N; B! v1 H3 U3 v/ t4 }| 13 | bb |
( U( D( J8 v* v, n2 E6 j- N| 16 | cc |9 N: H5 G8 g4 f5 L5 C  p7 l
+----+------+- |/ @; p2 _/ D8 s; @: A8 ^7 S) m
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);& @" v. P" o- k
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
$ _! N/ t0 \, r原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
" j9 h) z4 q) C9 N怎么规避这个问题?
$ Y$ d! k6 i6 i% G- l. B! o再加一层封装,如下:
- l0 {  u( F0 P$ X. O8 ~1 x, O. _mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);6 W6 n5 J0 u/ E4 ^; h' s# t
Query OK, 3 rows affected
mysql> select * from student;
# P1 G2 g5 L2 b6 Q* H+----+------+
& ?2 V& G+ H& D% \  y| ID | NAME |
5 i3 C& B" ~- f. ^: v+----+------+
$ g$ U2 a' j5 _| 11 | aa |9 u$ [6 |7 ]3 d) k& T$ K* l
| 13 | bb |! t% E  C9 ^$ `. h1 m0 p; |
| 16 | cc |
$ e; z/ e3 K/ z+ D# j9 G. |% o+----+------+2 K! ]* P, m; o/ \1 x
3 rows in set
- @3 G2 `7 j# H; ^: y1 ?1 g6 b% M
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
2 a2 N" }; @" H9 \7 w' N5 o! W$ b9 m- J, Z" O- k6 m; [5 G2 W6 E; Q! S8 u

& X# i' Y9 V$ r: T0 `
回复

使用道具 举报

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

本版积分规则

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