方法1:+ j3 K. e L, V
1、创建一个临时表,选取需要的数据。
5 O+ A3 Q# u8 d0 E2、清空原表。
7 y2 X& L# c* j. P) g8 K, B' Q3、临时表数据导入到原表。) a# m( v. V, Z+ T( a4 I
4、删除临时表。
* b% q: U3 x7 d/ }, P! s5 amysql> select * from student;8 i- }' ~# ]; E% N9 N; Q# H; w: k+ p3 N
+----+------+
+ r5 e0 F' q$ h$ Q| ID | NAME |
) ~1 f' X+ M5 ?. w2 }+----+------+$ Y8 u# Z3 r9 K x
| 11 | aa |
! u2 i. E0 R. c, K- U| 12 | aa |# t2 F. U0 ]8 Z8 H/ v( A
| 13 | bb |7 j9 E2 ^% M8 R. D
| 14 | bb |/ k$ h" }3 l) V9 y
| 15 | bb |
. x1 F+ I' r* f8 G/ A; B4 O/ \| 16 | cc |
! G1 V- V- G! \! |+----+------+4 w! A3 {- O: T0 E* e9 x
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;2 z1 k2 y0 Z! v# T
Query OK, 3 rows affected( b! ~9 r6 R3 L/ [
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;+ G5 y0 p E/ q% c0 x
Query OK, 0 rows affected mysql> insert into student select * from temp;! N/ R2 u' ^9 l: j; i+ z2 }2 R
Query OK, 3 rows affected
- Q+ t2 w' o. O- tRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;5 t2 ]7 H6 W' s
+----+------+
' Y- t. R/ Q8 m/ }$ [- U* ]- K( ]| ID | NAME |
9 I: Z. {: p1 W3 F+----+------+8 J, |! o/ y# ]! w
| 11 | aa |0 x8 e6 D% r' ]) m0 R# P! G! r" z
| 13 | bb |9 o$ [3 U3 O3 u! B2 E
| 16 | cc |
; Q/ g% r$ N. f$ m2 e+----+------+8 }8 n" U, S8 D% u9 O* w
3 rows in set mysql> drop temporary table temp;3 ~, l4 ?4 ?6 H, |1 ^
Query OK, 0 rows affected
& H5 E9 |, l/ U4 k9 S这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:% ?: S' B/ [& k1 e4 s
mysql> create temporary table temp as select min(id) as MINID from student group by name;6 m$ P& t0 T5 e- S+ E! |" U. Y7 n
Query OK, 3 rows affected
/ d7 D- \% y K( }- E$ i7 FRecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
8 O# A# s) C" I& z$ s3 G" A# SQuery OK, 3 rows affected mysql> select * from student; [+ Y/ q) b1 v. ~) e4 P" a* g
+----+------+/ |8 a( t: ]" a
| ID | NAME |
2 s; t$ N" N; _; F# R& ?5 \+----+------+4 @$ P& \9 e; F! e% W3 F% c
| 11 | aa |
/ N& k$ j8 ~( C| 13 | bb |& s9 O4 W' `4 A+ w4 }5 _
| 16 | cc |- b3 _0 \" L. k y0 m
+----+------+# ~; c, z. k3 n5 N) \# d
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
4 R/ d8 A) J! Z) K6 u执行报错:1093 - You can't specify target table 'student' for update in FROM clause3 H# A% S9 J1 A" q0 |: j8 C8 p
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。( S4 I2 y2 f: O, B5 q9 b4 G
怎么规避这个问题?- K% {3 [4 Z1 O1 j0 x* i
再加一层封装,如下:2 \, o5 X1 K; K1 k
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);3 W3 k3 ~0 s, o6 N# n
Query OK, 3 rows affected mysql> select * from student;
2 [" [! n+ I) V/ Y$ C! n9 J) Y+----+------+; `% ^9 B# t' ]+ B' W
| ID | NAME |1 d! F/ Q" K; D0 T$ Z" P& Z! v
+----+------+
4 B: v& Q, h: \! G& a- p% ^5 W# _- a| 11 | aa |
" C" T$ P2 L" J2 |/ j8 _. _| 13 | bb |
( l% G% O! e* l) J8 D) u( B* G| 16 | cc |
) ^9 }' @! y8 u0 h, j* |4 G+----+------+
/ u/ |2 `$ I1 V8 O3 rows in set : O6 S1 c% s% k
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);* _. U9 j) P- ?) U9 Y5 x
; \( @9 j: n% E( n4 D
$ e% F& W2 U) [+ k) W
|