|
方法1:
9 L- m. N) Q r5 {7 @1、创建一个临时表,选取需要的数据。
. ~* C: s; u4 }7 b- ?3 Z/ U4 `4 H2、清空原表。
8 e. ?% v F2 k5 ]9 H3、临时表数据导入到原表。/ ]9 S' k3 G( G: R
4、删除临时表。
b* s* k2 o# G7 j3 V9 s, O. D# A; K K% Jmysql> select * from student;; \6 @! J, H" y+ ] Z) l/ a9 f
+----+------+8 ^" K4 L' B" i6 w- g
| ID | NAME |
7 b( M2 L9 E, e, R+ ^2 W+----+------+: R9 o% v5 L& h7 E0 a
| 11 | aa |
9 b7 V& j! A( x4 _% v( _# [5 V9 z| 12 | aa |
# o0 g Q" T U| 13 | bb |
# J8 U! g' ^ M$ ^| 14 | bb |9 f' y& I0 Q* W! i) q8 e+ c0 S
| 15 | bb |6 Q2 G+ K/ h, i J( @% J2 c
| 16 | cc |
5 q. |, ^; T; D4 D% d8 H$ K+----+------+
5 i, c2 [9 y1 \# Z i6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;$ o! B2 G2 H! F0 V4 o5 i
Query OK, 3 rows affected5 a8 h4 p n+ R1 @/ x9 i+ y
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;0 `/ t4 [! m: c( {: X% O. p
Query OK, 0 rows affected mysql> insert into student select * from temp;$ I6 m( d, \ b N6 _" B
Query OK, 3 rows affected) O; F3 |7 V3 X2 E
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;) V+ i1 F( _+ A6 X: Q8 k5 L
+----+------+' {: Z5 e" W' I# d0 K: h* J4 j& J7 O! G
| ID | NAME |, v* C: u0 v* U7 D4 s; M9 w
+----+------+) F5 u. i( j4 M2 Q
| 11 | aa |
# S% [/ Q1 _) V0 b2 G$ l% k| 13 | bb |
a, p% n7 {9 t, i& I, }( z, U| 16 | cc |
, z3 x# A: Y1 K3 R7 _+----+------+" u0 E7 n/ F z& P) b+ C/ S7 r: L$ _
3 rows in set mysql> drop temporary table temp;8 e6 X0 {8 x _. @2 G
Query OK, 0 rows affected
1 o' N5 q1 g" m& Z这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
& ]! J7 r6 s, p+ v7 Dmysql> create temporary table temp as select min(id) as MINID from student group by name;, W; Q) z. N, [1 l- V- ~2 n* r8 M) }
Query OK, 3 rows affected" ?7 W6 z: w2 [8 |
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);3 p) n- k t; S9 K/ ~0 R5 Q' ^
Query OK, 3 rows affected mysql> select * from student;$ B* }- u8 c; _7 D! b
+----+------+) t* v7 x; I8 ^+ H5 I; y
| ID | NAME |: t- W3 y1 i) P
+----+------+
; a* P& D# ` y7 ^ F( }5 V+ n; @| 11 | aa |; G# u" V% F; z, i! Z
| 13 | bb |
+ p( G, N; R" R- p0 |; A6 y| 16 | cc |9 `. w1 v( \- ~ i' C/ o
+----+------+( l* k: U4 r( d# {- v* a8 \0 \
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
" F" \" U( b. {1 W执行报错:1093 - You can't specify target table 'student' for update in FROM clause* |6 |+ Z4 u2 E# v1 {- ^! [: e
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
0 b% y B n0 k5 b怎么规避这个问题?
* Y+ [7 ?) x- f6 G再加一层封装,如下:' O# s/ s4 e7 [
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);& o4 R, f, f% `4 J+ t7 Q) J( u
Query OK, 3 rows affected mysql> select * from student;
: q3 p8 q/ r% s: g) C' _( a+----+------+
. [. I" U8 U5 [( Y, K| ID | NAME |. E& u/ m% \1 C+ g1 D% T
+----+------+8 u% h. m+ n8 J" D& b
| 11 | aa |$ N% ~5 {' x; \) \5 N8 i
| 13 | bb |
$ w; u, q/ S' F" c E; e| 16 | cc |6 m+ C6 U X- q) R2 }' A
+----+------+
; l$ M1 [% W4 B( A+ V3 rows in set ; @3 d( o: b( ]. p
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
8 @0 G/ z$ o) ^: E% z- d& t' f) S1 m
. C/ q* r$ s' E; \9 q1 s- I4 o% a |