方法1:: b3 s/ u. D: B
1、创建一个临时表,选取需要的数据。% {' |( F& O4 s. K- g% Y# |: d3 J
2、清空原表。$ d5 ?; O+ r2 `& N( Z9 y
3、临时表数据导入到原表。
+ @$ Q7 v, x0 N- N7 n+ F4、删除临时表。" V8 A( C0 D# A* g
mysql> select * from student;* m( b% s- n( ~5 b _1 h5 \4 y
+----+------+
1 c4 C0 b0 |) S! ~| ID | NAME |1 E5 R. V( p9 R: R
+----+------+7 ]4 Q& E+ F) O, f% T9 M) `
| 11 | aa |
: S( l8 ]5 c; b( a4 B% D( N) U| 12 | aa |
; w& l3 b2 }1 P2 r' n# z| 13 | bb |1 m, c8 e2 O/ v- ?) A" B
| 14 | bb |
: ~4 {, L( U( {7 T| 15 | bb |- x' r! ^+ X) ]; q" n1 D$ J4 b ^
| 16 | cc |
6 ?/ g* s* b4 @4 ^/ m6 p' ~/ j+----+------+
; C2 c! r- N- e" m- S3 A6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;( ^- l9 U) }$ V9 m! F
Query OK, 3 rows affected. U$ x3 O3 Y: L7 j, l
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
# k) z2 J, L3 r( V# eQuery OK, 0 rows affected mysql> insert into student select * from temp;$ N, k& p" h. J$ r9 i
Query OK, 3 rows affected
5 g" C9 B) G! I& `2 J( |Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
. ?# w( ^+ N( ^+ d+----+------+/ p& ?; S7 F. m5 C" a
| ID | NAME |5 Z0 F8 k! `+ v+ y/ G
+----+------+8 E/ J8 v2 O2 O0 @$ v: M/ N
| 11 | aa |0 r p" r/ \& A, J. F: V
| 13 | bb |" ?5 _; O2 J: Q5 z0 S; K4 }! q
| 16 | cc |& h, ]0 J H2 Z& H* S1 U
+----+------+
( G: G+ n8 e8 Q" R; h G0 f3 rows in set mysql> drop temporary table temp;
0 n3 ]4 @% J1 c* d) ?Query OK, 0 rows affected
; Z# O6 _: R" M' a. {这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:" \' V# I$ z9 w0 {' W" |1 x3 ]
mysql> create temporary table temp as select min(id) as MINID from student group by name;
8 ]1 f# [/ k3 C0 A% dQuery OK, 3 rows affected2 d1 V2 z: [% E1 F$ V! r
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
" Z; k) ^" ^# m5 J- T8 u% VQuery OK, 3 rows affected mysql> select * from student;. |+ A) }& `5 [% U* Z
+----+------+
9 j5 K6 q a8 {0 H6 _8 e| ID | NAME |7 F8 H5 ~! D2 E
+----+------+2 v* d+ {% \" A
| 11 | aa |9 |6 ?$ |, d2 e% S
| 13 | bb |5 u" }7 S B5 I, K0 \+ M" @
| 16 | cc |% l2 \! |; m& R% m) e
+----+------+
. R4 n, |% |9 p& r! s' b3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
0 U( r4 {, e4 A8 g H) R! w执行报错:1093 - You can't specify target table 'student' for update in FROM clause
- ?+ W( ?! q( |4 H% X6 z- y原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 }1 Q# B9 ^" O1 `( L怎么规避这个问题?: c; G5 T1 M/ {7 t# |) \- M& {7 d$ F
再加一层封装,如下:4 U: S& ~! k. ?- `
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);! p' b! i: \, K/ A
Query OK, 3 rows affected mysql> select * from student;
# ?/ x2 {) G2 X6 N4 L0 v+----+------+
! \1 l" q C3 G$ h! S( l3 [| ID | NAME |: z+ y( j) T0 L& F0 q
+----+------+$ u* O6 c2 V2 Y6 A& a
| 11 | aa |
( K( s: m4 c$ t& d. U| 13 | bb |) x6 K8 ?" v& [* i1 D# g! G# O
| 16 | cc |
, D* q" l, K; }0 Y6 y& V* {5 h+----+------+! T2 ^- ]$ \7 B/ U- c
3 rows in set
% ], c6 D0 O9 X方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
' {3 ]5 `# y0 ] b/ C' F' z5 {! b2 P. ~* I1 Q3 |( }+ Q
5 U7 Z% J4 r" ~! K4 h; G% h8 Z) p
|