|
方法1:0 A" }5 t1 @1 L/ o. a% J
1、创建一个临时表,选取需要的数据。
' }; Z; a3 L; u% _$ y- ]/ G$ _2、清空原表。: K S6 q5 j8 ~# c4 _0 Z+ j: U. |5 e
3、临时表数据导入到原表。8 N+ P$ T: }( }* i7 G" Q S2 K
4、删除临时表。2 V$ Q/ A9 h6 y$ ~. b
mysql> select * from student;
! R$ [" i4 E: z: i% M+----+------+7 k# v9 W2 X9 ?
| ID | NAME |
6 g A$ }# o4 U9 D+----+------+6 L, l$ u4 g, q8 O
| 11 | aa |
3 j, K3 v& w' O$ u# i| 12 | aa |
4 L% P1 w3 G' P+ R| 13 | bb |! C; o( H3 M# B
| 14 | bb |" h- a2 e1 ^ S; K7 Z% b0 [
| 15 | bb |
. F8 o( P3 k/ {" D! s" i| 16 | cc |
7 k! p0 f2 v# U. k. a+----+------+2 Z8 f* r6 C: v& L
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
% X1 s9 A4 i# v4 y" }; ?- b; BQuery OK, 3 rows affected# u- M& v9 a4 @- [$ C
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;% o: B. c7 I3 t+ D" c3 d; b9 F
Query OK, 0 rows affected mysql> insert into student select * from temp;
8 `$ j! p& N. M* M' B* E& @Query OK, 3 rows affected N8 H6 V; c4 B$ m
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;# E! _+ R+ `5 V0 p0 R% y( o) @( M
+----+------+# E6 X/ `4 J3 ?. `) G, C* q
| ID | NAME |
! M. ~/ T8 u- f' J4 R2 z( E+----+------+
! ?: h- C+ z2 Z| 11 | aa |
- y9 h+ g. s( D| 13 | bb |4 r9 g- H3 v* c$ y& Y# ^7 V u
| 16 | cc |
6 D2 S6 Z/ U: `: }% D+----+------+6 |- F; h/ u. x* \
3 rows in set mysql> drop temporary table temp;5 X& N/ m$ \5 W! {( ^$ i( @) P
Query OK, 0 rows affected
2 ^* c5 N- w; |+ @( V$ M. y这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:7 t2 C+ ]6 i( u
mysql> create temporary table temp as select min(id) as MINID from student group by name;, n# o3 x0 ?# R5 e
Query OK, 3 rows affected+ h, U+ N/ o8 F' i( x8 M1 A9 I' r* ^
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);1 E/ r+ V& Y0 I$ j
Query OK, 3 rows affected mysql> select * from student;
; ~/ _* o5 e& \& B+----+------+; Y0 w' X$ \- k' ?& n" K6 y" W
| ID | NAME |
' ] b: o" z+ C' W+----+------+
1 B( j3 X d' l$ C| 11 | aa |
3 L/ w3 M: _7 c. s4 u| 13 | bb |+ c. |. p2 `5 E8 V& @5 ?
| 16 | cc |6 `# T: n$ \5 A
+----+------+& t0 j1 t$ X! ?1 y/ J
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);# A3 |5 C9 H- W4 l! P
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& N0 x1 Q, b: f1 E& N原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。; @5 N/ e7 F/ j- }* r7 R1 G
怎么规避这个问题?
8 L1 D$ I1 o# [5 N/ O- j. h8 ~0 ~5 _再加一层封装,如下:
2 j4 T) u; I5 n& b* mmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);' ~5 \# m5 S; W6 f; `7 _
Query OK, 3 rows affected mysql> select * from student;1 F2 g' T* V6 q5 f7 W7 @0 w" Y
+----+------+
) c1 N; g' @# t" r. v& o( s0 F, ^- i) ^8 b| ID | NAME |" h. U7 q# S8 L+ l$ Q# N) z
+----+------+
6 f: ?7 K- Q9 P3 m3 U9 M| 11 | aa |
( n- [9 j7 }. b( P0 N| 13 | bb |
% b4 Y4 u' l% F| 16 | cc |
+ i- ~$ Q/ I9 |7 P7 p" b" \# `+----+------+9 t, ?$ t( U4 J* ]# B" j' s+ X( X
3 rows in set
m0 s! C* e/ N1 n2 ?方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
+ ^/ \' x {6 {4 {- |2 Y% _) P& K" z! X# @& j8 ~/ @
8 }9 s3 W0 ^3 ?! ?6 L7 `" H3 p. S% ] |