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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:) R( F2 U# Z: i+ ?1 F
1、创建一个临时表,选取需要的数据。  U5 g4 z! s7 Z& f  U  F' G
2、清空原表。* K, O  K7 d. n' V) O! `
3、临时表数据导入到原表。/ P/ d0 j$ i* R+ w! a% T
4、删除临时表。
( C% `) @/ g' G" l" F4 Q/ Pmysql> select * from student;( k& S3 b% C: m+ m: n8 \& G
+----+------+, S. r/ f  ~( `' a* c
| ID | NAME |
6 C0 f1 w. z0 I. y) i( p+----+------+' \2 b* ~2 d) O' z3 M" {* ~3 w
| 11 | aa |  }( E5 ^) h/ |0 x
| 12 | aa |: u( K* T  p: p  E
| 13 | bb |/ _0 \6 H* ]" X2 n6 X
| 14 | bb |/ l& O* Z& X9 A
| 15 | bb |
2 o$ |' Q  N( T4 w. l% I| 16 | cc |& T2 D1 w$ U2 D4 o" ?; T& V
+----+------+8 F' A& a) X% {6 A$ i
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;" n& J6 g4 Z) J% v' Z! v% E6 Z& Y
Query OK, 3 rows affected0 ]2 C$ W0 Q0 w1 U# b; h
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;8 T( M. J. X; d. A, u8 G1 H
Query OK, 0 rows affected
mysql> insert into student select * from temp;% X+ y9 L) q) t6 d% A8 a
Query OK, 3 rows affected2 F8 O9 U/ |: e# J6 j, i3 I
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
5 c: g& G, `$ R. z* f9 A  S2 P+----+------++ b/ j% a2 x7 y! _+ C0 ^
| ID | NAME |  {/ x: r0 m" _2 `7 S- S4 m. O
+----+------+
+ q" B; N6 s4 d$ X| 11 | aa |* L" B( t5 x, {3 g6 ~; Z
| 13 | bb |
; o2 K3 ]# ?# c3 N" X| 16 | cc |% u. ~+ _( p* G
+----+------+  r6 y% _! X% s) s1 i
3 rows in set
mysql> drop temporary table temp;
; s4 r. j% ~$ `3 Z, E' ^7 WQuery OK, 0 rows affected
5 E- U7 c6 [2 g0 p/ @8 ]% r0 ^这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
1 ]  G  V* M9 x6 B( Dmysql> create temporary table temp as select min(id) as MINID from student group by name;7 M% h9 w$ S9 `
Query OK, 3 rows affected7 X% k9 s; j2 Q8 u! f% n
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
& a' y0 G, ?4 F5 m1 F. ?Query OK, 3 rows affected
mysql> select * from student;: D9 f. b1 A5 a
+----+------+
3 \5 x% d  l' {/ [% |8 }" O| ID | NAME |
, N+ Q! ?0 F( C0 E+----+------+
! x2 `' o, J) D! \8 J- \| 11 | aa |
4 I0 X& x) P+ p| 13 | bb |  c+ j+ Y' l  f1 U# l+ ^' h- j) |
| 16 | cc |0 t$ L7 {% \6 x
+----+------+
8 p9 n/ u; j$ Y! p# ~3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
( b, Q. f9 q4 ~执行报错:1093 - You can't specify target table 'student' for update in FROM clause
, n& H. a. n" j+ g# y$ `原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。+ r: Y# I6 h3 x! c* x( R+ i0 }4 M9 e
怎么规避这个问题?
& B" R# A0 V) Q$ D再加一层封装,如下:
  t* V; L/ Y, Q! y: X8 I% a9 [mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
" m2 B' C0 g; E. d! fQuery OK, 3 rows affected
mysql> select * from student;
4 Q+ n$ N* J9 B9 `+----+------+
: z6 s+ }5 w$ S& f| ID | NAME |
- C3 V5 ~3 u8 r0 L! o: _6 F+----+------+# V5 D4 }3 x: f' W
| 11 | aa |
' i# j$ p( j/ l; h9 H; ]9 o; N| 13 | bb |
6 ^' c! A: d# ^| 16 | cc |
! _' r& L! `1 T3 Z! g" U( R" P+----+------+9 L) Z7 W$ H# T4 R7 j/ u2 a
3 rows in set

% o/ C2 l, c- R$ Z6 U8 b方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);4 C8 P- _& H! V7 E" H
7 A8 |; t7 Z' h- y) N

$ M# H9 _, q- F3 s! v, g, S
回复

使用道具 举报

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

本版积分规则

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