方法1:$ t X( m. \1 f! o5 ?
1、创建一个临时表,选取需要的数据。
: J) Y+ S6 F! V! g; v$ \0 F2、清空原表。
- D( v# d# X# O3 _* E3、临时表数据导入到原表。
4 Z9 H1 S; V* ]8 q0 u r/ g4、删除临时表。
+ i3 A) e3 a1 _- T8 ^mysql> select * from student; K! A% Z( p% K t) b# f) P3 A; U
+----+------+
" k# Y4 ~3 \5 C| ID | NAME |; e1 H- c( I3 [" K
+----+------+ n( E" ? h/ ^, u# C
| 11 | aa |
* z. j/ j3 S7 M0 f: P& C| 12 | aa |
/ d: H% G' Z2 c( B0 m: M( l7 r U| 13 | bb |% t3 d9 m; M& c: F- R
| 14 | bb |
& U- \( z1 j! j% y W: U/ G/ M| 15 | bb |5 d& h; `7 D' {& C8 H) o
| 16 | cc |
" b" n- C$ [+ _) ^6 q t6 s+----+------+
1 J/ g, t4 Q! w8 j6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;$ `! o6 P1 I( e! X
Query OK, 3 rows affected/ l+ E" a% Y+ R2 }4 |
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student; q0 S- t; t4 b( Q5 V
Query OK, 0 rows affected mysql> insert into student select * from temp;
0 R o/ V: j% V# J8 G# T$ aQuery OK, 3 rows affected7 d9 ~2 W; Z6 n( `4 J- G7 h
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student; y9 x, {3 p5 p& F- o I
+----+------+2 m" ^' M9 \4 s
| ID | NAME |
+ V* ~8 z3 S; W( \% F+----+------+
# R9 A- e: |6 |7 x/ z8 _| 11 | aa |
1 H+ V/ k! }0 u& _* Q! @6 _+ ]| 13 | bb |
3 r9 K4 R, R* u0 O' X7 s, w T| 16 | cc |
4 d2 Z/ W$ u S3 q: f1 D% O+----+------+
& Q R3 p6 r9 }+ H- X, B3 rows in set mysql> drop temporary table temp;- _. F& e, N. ?
Query OK, 0 rows affected* v4 r% E, o# S# H) a8 V* Y1 e; C
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:) B% v! Z- h' f$ k
mysql> create temporary table temp as select min(id) as MINID from student group by name;
5 u9 t4 Z4 W' D" c$ f4 Z7 l$ o1 @Query OK, 3 rows affected! @" h: B" O8 w: X8 A! D
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
, z& j- v" w% G7 f3 SQuery OK, 3 rows affected mysql> select * from student;
/ D* @- o7 u/ Z" ~1 {" |, d- y+----+------+
" b/ o0 r% l$ W* C' \: u+ H| ID | NAME |
1 z ^# T% D% G! x L2 B3 |3 `+----+------+
# v8 m; j8 h* Q% P' E3 h* X| 11 | aa |
5 ]+ v" w+ ]4 a) Z0 H+ i1 r4 t| 13 | bb |& q4 ], d; [% Y+ j9 |4 n
| 16 | cc |' |7 X( Q: O! @0 s: z* t
+----+------+7 _4 q' y6 m: t) n/ n
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
: o2 R4 t0 {& f0 V3 y执行报错:1093 - You can't specify target table 'student' for update in FROM clause
* Z: }# ?5 l p- H* E( j原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。2 K, c, i4 @! A- E; B% _! F* e+ `1 k
怎么规避这个问题?( ^4 e# r% t/ s3 }4 |, M
再加一层封装,如下:
! H+ a$ ?( P" I7 z N4 r7 vmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
# |# a6 I3 g& `! R7 ~1 TQuery OK, 3 rows affected mysql> select * from student;
5 \! ?! I( ~7 A2 R; V2 q+----+------+0 ^& Y- y+ h% `+ D
| ID | NAME |
. |) \, D' \2 @* K: V1 i# A+----+------+/ m* }% b' }2 p* l
| 11 | aa |
# S1 b( b R+ r E# \| 13 | bb |0 |2 `) F! p9 D. j. _5 n
| 16 | cc |
( K7 T% }8 a- D8 x4 ?, C# j+----+------+' Q- s. i- ~3 v; b- n0 o# c/ k
3 rows in set 6 T8 F4 J) {4 w3 V% H& {: R7 m$ K
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
4 U" b7 g* v; ]' T. i& k0 S
8 y/ j$ H* U: U' ]. f8 f+ ^/ n, M9 O- V x8 W0 }1 h, W
|