|
方法1:
" x+ x& G2 w5 H% W4 f/ \$ E7 g1、创建一个临时表,选取需要的数据。+ ~* J. `- l5 J/ c1 x
2、清空原表。
2 M. Q" u1 D n& n/ V: ]3、临时表数据导入到原表。
/ @; b" m. {1 D! l6 f% F3 `8 U4、删除临时表。
2 [4 ?1 E! o1 {mysql> select * from student;9 `0 S' \, c, z# Z. B8 C4 q# [
+----+------+
5 v+ ~& `2 @& g| ID | NAME |
# J, f% K8 K- X+----+------+& }/ i O. v7 m2 X* v2 W, |
| 11 | aa |& J2 \! R% \* t, V) F
| 12 | aa |
6 y f! R4 o8 p+ x% u& t# ?| 13 | bb |
9 `" `/ n' H- Y- E) u( e: v# A' B| 14 | bb |& @& R8 H, q$ p( t
| 15 | bb |
! Y$ ?8 }4 K9 N+ g) Z, a" I5 g* r: H| 16 | cc |& I/ H( _: t' h% A% q% q, J) [7 E
+----+------+
% N9 n! W, d: G9 ~6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;- n7 o$ @* s3 N
Query OK, 3 rows affected
, q3 |0 w( ?# G1 c- f8 nRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
" T2 D/ T$ a/ `9 p0 lQuery OK, 0 rows affected mysql> insert into student select * from temp;9 d f& R! v. g3 _
Query OK, 3 rows affected
* U; a, A- j. O: s% |# MRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
j7 _3 y" c7 i+ I3 H) e; t+----+------+
2 L4 v6 c# w- _; w$ x2 {| ID | NAME |. I8 ^( i0 J0 H# P, Q
+----+------+
# V2 F8 e# b; y0 w6 o0 }- I- r) D| 11 | aa |
( L7 ]: h' s1 d9 Y) o/ l| 13 | bb |
/ k+ ?, V) A1 z# t/ b3 N| 16 | cc |
- b4 r7 W) ~6 ?. W; V' `+----+------+
0 L4 H: g& M8 w- x7 O2 ]4 D9 ^3 rows in set mysql> drop temporary table temp;
: | \% k& x* @1 y& L7 B9 H) TQuery OK, 0 rows affected
, K8 y, {& s$ K. W这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:' y: ^" |7 E/ w) \1 P
mysql> create temporary table temp as select min(id) as MINID from student group by name;
8 h: M0 P+ c- HQuery OK, 3 rows affected) k- B$ c4 }5 @! P; J* u
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);/ J6 k+ F- v' L' n3 m" }) f
Query OK, 3 rows affected mysql> select * from student;; o6 Q/ r( F( F% g3 e
+----+------+
6 K! l1 F E; A: V+ O) Z: p| ID | NAME |' r8 s o9 q. K- h+ y, G1 E9 \! O$ N
+----+------+
% k$ B4 O4 x" Z) Y1 Y: ] U6 l. o| 11 | aa |
- `: s6 Q$ L1 C& V+ d| 13 | bb |0 t, F1 t; t$ ^' Y# A) H
| 16 | cc |
. o0 R2 y9 Q! u+----+------+9 r7 r3 Q S3 w7 y2 o3 T" U
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);7 V8 \4 O; I. J
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
: E+ H1 P4 r5 t/ F2 c4 b原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。$ f, K* @0 _2 b5 `# l7 h" y0 @8 G
怎么规避这个问题?7 d* r0 ~+ F- K6 b
再加一层封装,如下:
. H8 d) D7 Z6 Mmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);% i' ~* \5 A0 l
Query OK, 3 rows affected mysql> select * from student;5 `5 C/ k3 D7 h/ R3 @6 U9 S+ J
+----+------+
, H/ }0 M/ H+ X2 {8 E| ID | NAME | b" @: r+ p: ]) @
+----+------+$ y/ K& b1 N. ^, A+ [& z9 {4 ?
| 11 | aa |
! K( W8 g0 q1 {% D c: X* u' c* ~| 13 | bb |4 w/ ]5 j/ [, ]& ?
| 16 | cc |
B, L2 s$ P. }2 w; V+----+------+
) b: {* [4 i% M& `3 rows in set ) t: M4 Z5 x& G) B) ]9 T$ Q
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
6 c/ ^$ _% ]1 j2 C) f @5 V2 i% `6 A& u X2 d
) r1 F2 F$ c) t. g2 X) W% B5 o |