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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
! b1 ]" f3 n/ `$ h1、创建一个临时表,选取需要的数据。
" ]/ O. c1 z0 P* m% b' @2、清空原表。
+ N. _" O9 O$ W: d: H3、临时表数据导入到原表。. d) @4 _  \! j& v/ v$ Q1 p
4、删除临时表。
- [3 R1 G% B0 \* F8 K1 cmysql> select * from student;& d9 o- t/ a6 j2 D6 b/ P
+----+------+! {' ]: T5 N& o6 u: m
| ID | NAME |; [" @% w) Z: S. N/ y
+----+------+! w* f( ^/ U! O( o. x2 i0 M
| 11 | aa |
7 ~. c- q0 W* u1 s| 12 | aa |0 }9 M! b& p7 C" i8 J" K9 ~
| 13 | bb |
3 E/ p3 @5 k' E  b| 14 | bb |7 B4 ?' K# o( E) A$ v' O
| 15 | bb |6 S* e+ ]( h* h4 S7 \. N
| 16 | cc |6 t! i9 `6 g; a+ I8 @( `( l
+----+------+- j/ Q" \+ D( D
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
% [( e; |/ L1 R6 r" y' O/ sQuery OK, 3 rows affected' l  t. N  u) i: A/ b; O
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
! @! `) S5 C! U6 Y" O% y( GQuery OK, 0 rows affected
mysql> insert into student select * from temp;
7 o" [' n+ m# a2 n- X' ~Query OK, 3 rows affected  N; u2 D% i. g; X+ j& h
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
1 `5 Z" l. w5 a+----+------+
2 z& [- c+ V! _, A# N! D& i0 a; I| ID | NAME |
5 k; T& ^% b6 s! U5 V8 ]3 O/ I2 b. G5 k+----+------+
8 h2 i& K0 u% o3 M' @| 11 | aa |. R- Q$ X& H, @& _! {
| 13 | bb |
! v1 j5 r; h& j. l$ j| 16 | cc |8 ]3 [1 J6 H. J: E6 [. y7 `
+----+------+
! S# [! ^( b9 a: a+ X, H6 o3 rows in set
mysql> drop temporary table temp;8 d! B/ D% G; n- F8 ]
Query OK, 0 rows affected
, S& K7 r2 Y, c/ p这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:0 G1 Q' ?' q" s% |: _7 b
mysql> create temporary table temp as select min(id) as MINID from student group by name;6 l) [1 s7 S& b+ E; j" A$ r
Query OK, 3 rows affected
* \8 M7 ~- A' H  YRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);. w* f* j) x+ U0 ~8 P7 r! ^
Query OK, 3 rows affected
mysql> select * from student;/ Y- l0 W3 I+ K5 d8 Q6 g2 ~% c8 ^
+----+------+
9 B1 |+ ?7 p5 N2 `6 p/ r& K| ID | NAME |8 j+ }2 N: |) h8 H0 \& E7 m0 v$ ^+ [( Q
+----+------+
7 v! J! \* p0 i* g- ~| 11 | aa |
4 [; q) t; u! Z' Y% [| 13 | bb |; d# [) m; b- V
| 16 | cc |
5 l! ~  H2 C) f6 ~& G/ Q. o$ Z+----+------+/ A, C  T! `  V1 a* p2 a
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);7 C" i( H! m- X) G' u) R$ _
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
; M, m+ |' r  t原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
5 q( @! `" }" E) R( f6 P$ ?' M" X怎么规避这个问题?+ `# T- A( m6 W7 E7 B% b& V
再加一层封装,如下:
4 Y* Y0 P# \; |+ g( hmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
" X$ p+ M  W" v0 xQuery OK, 3 rows affected
mysql> select * from student;1 L5 ]: C! C# F1 M! D+ q
+----+------+
: Q2 t  s' E0 _" v6 G| ID | NAME |  T7 G& m: E2 h) g# g% c% E) E5 H
+----+------+
  _# p% u1 ?1 `; {( ]! b' c9 a% k$ u7 U| 11 | aa |
  O! D( w( A# p+ U5 r2 E2 D6 [9 K| 13 | bb |, y: [: ?! B* D* l
| 16 | cc |6 P% d4 M8 v8 k% {# Z
+----+------+
8 D  o2 ^+ ^9 ~6 F3 rows in set

1 [" z% J. m. ]* D& \7 ]' l方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);6 q1 m: a0 E. X" @, Y
# k1 g$ _0 U4 ^7 X' [1 v' n

6 Q9 A. R6 Y7 C3 X
回复

使用道具 举报

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

本版积分规则

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