|
方法1:: b. z5 C* e: W: S
1、创建一个临时表,选取需要的数据。$ u4 @ ~* X, J+ s- _
2、清空原表。5 ~$ _" u& ?& P+ U% x
3、临时表数据导入到原表。
* u( n6 a3 g7 S) C: `4 l/ z& }4、删除临时表。4 l7 @1 d. X, w4 T% T' m+ E% q
mysql> select * from student;
8 I: w/ ]) J+ l3 @ M7 A+----+------+
% ?9 S4 L: N9 S/ ?8 T, B- {| ID | NAME |
3 ?5 q+ Z* c9 U" y% z2 l+----+------+
9 K9 f8 b3 I6 T| 11 | aa |' _# r& v: r& u7 | C4 r
| 12 | aa |
3 t, d9 o n/ y$ Y" ~5 {- o| 13 | bb |9 v! K5 l# d k
| 14 | bb |
* y9 W3 _$ z* ^1 a) R* L6 E% ]| 15 | bb |
. X9 Y2 {, `9 \| 16 | cc |/ f% h9 [, k7 z0 a+ V( s
+----+------+
/ P/ ?; S% q6 Z. _5 E0 r |2 J6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;8 U& s% a& q8 `+ V! F K
Query OK, 3 rows affected
3 g' a P2 Q3 KRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
( i) z" h! w% ?$ {! _6 o0 Q8 [Query OK, 0 rows affected mysql> insert into student select * from temp;9 }5 {- i! Y$ I- h0 O0 H0 k3 U% N
Query OK, 3 rows affected! t$ o# H' ?: ~, V0 ~9 `3 y* ~
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
; f6 j3 t9 f; |$ }4 ], p, z- g+----+------+8 `' O) H; ?& @. m5 `) z
| ID | NAME |
4 L& r/ D$ G' v! i( v+----+------+
& L7 u0 y, o9 x2 U+ w4 J| 11 | aa |
# |9 ?" Z# _- x7 W| 13 | bb |
3 T- q: C# W- P) G| 16 | cc |
4 t+ m% D: S5 G( q3 k& `- v+----+------+$ v; R1 l; w: r4 y" I+ a/ ?
3 rows in set mysql> drop temporary table temp;9 e- L4 e% n5 m6 L/ K
Query OK, 0 rows affected
( }7 P4 X9 t# n这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
: A" x# Z* C) mmysql> create temporary table temp as select min(id) as MINID from student group by name;# m ], H: e+ K T! o& ^
Query OK, 3 rows affected% t# J4 R- n7 ~ A6 a" n
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
2 x8 |% l: G' q3 F) kQuery OK, 3 rows affected mysql> select * from student;* V* s q& i- K- h" q5 {
+----+------+" p" v! F% }! B, M
| ID | NAME |! t( h, T. w a2 O4 e
+----+------+( }5 F6 w$ T/ x4 I- ?& p
| 11 | aa |; X% X& r( c; ?; I' f3 s9 |
| 13 | bb |5 k$ a$ L: ~/ a: O `+ t( B
| 16 | cc |8 Y3 j }# ]* w- s$ V
+----+------+
1 o% ?4 |: j$ Q& y! j6 F3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);& p2 P/ t+ N. F) h7 c/ P# Q( a
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
* \& D* x) ~* J原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。0 l) u- T" t9 v+ l
怎么规避这个问题? L1 l2 B0 H0 @1 }0 w& V
再加一层封装,如下:
) E' L4 @* y# V( z. Mmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
+ R. s1 m+ k* \4 s" j" F# r# hQuery OK, 3 rows affected mysql> select * from student;2 O- ~- a g5 M, i% o' A
+----+------+
( J( |" n9 ^" D1 t; a3 C| ID | NAME |
9 n5 H: j* g: r6 r" H# V/ I+----+------+0 j! U4 j0 N, B; G8 N
| 11 | aa |
# Q. `* K; Q( J% A/ z| 13 | bb |
0 |4 }/ E) z0 Q& Y/ ]3 j4 y| 16 | cc |) z* u* G5 O& l( X) J
+----+------+6 S4 u1 W* \, B6 M/ {* }! _, l
3 rows in set " G" b" r) \- s" v+ E E
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
: ~% ~. o5 E" P& P2 F7 T0 R6 N4 i, y) x( c& v Y7 }/ N
& Z5 I5 Q; h. R1 z1 s& g
|