|
方法1:% N7 m6 i1 a) _/ d8 W. p5 m$ F
1、创建一个临时表,选取需要的数据。7 \% Y0 a. x7 b
2、清空原表。5 q1 b0 `& w6 D5 h
3、临时表数据导入到原表。& P3 g/ s+ Q1 f( P6 t; `4 R) s
4、删除临时表。/ ~/ p- e; {7 C+ I, F$ O, @
mysql> select * from student;
% A& |; X! \' g5 e5 U- c+----+------+
3 b7 q: F" O$ q9 J A/ z* o| ID | NAME |. J- w( W" J+ c; b3 v
+----+------+
. X! J& w: m) X. M( F| 11 | aa |9 O( ]% [2 n1 ]2 g4 J% ]: @% Y) Q
| 12 | aa |
+ w1 N, |- o# K" r( w( y% e| 13 | bb |
; [8 |( K/ t2 E9 r| 14 | bb |
+ B1 ^4 t7 }) v| 15 | bb |; B* U0 u$ n0 l5 r# K
| 16 | cc |# m7 z" q: [, X! O& Z! h4 q
+----+------+: p7 p& D/ G1 G: r" G) V
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name; v9 ?* q0 N( K- J
Query OK, 3 rows affected
( A k) d+ Z: t* cRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;6 d6 w4 a0 k, j3 Z6 [
Query OK, 0 rows affected mysql> insert into student select * from temp;
& V$ `% t; T @Query OK, 3 rows affected
2 Y4 c, n1 ^/ c/ m$ a- c/ JRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
$ K4 d; x& W* h3 ?' ^9 E+----+------+
e: S8 Y; W/ @% Y! S| ID | NAME |
# a3 M# J; P) X: W! u+----+------+
3 \7 B/ f- J; L J/ {% e" `$ ]3 `| 11 | aa |
/ P# X9 G: k2 R/ t| 13 | bb | x. \% U& v6 D' E6 c
| 16 | cc |- R+ i' b, z3 j8 y. S
+----+------+
. [4 q, y' D! w7 w# n/ |9 I3 rows in set mysql> drop temporary table temp;
) V) q# v- {5 d6 M6 JQuery OK, 0 rows affected; c' \/ N5 F+ S1 W/ ]
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
( b& D9 d8 q) q# v; l4 Hmysql> create temporary table temp as select min(id) as MINID from student group by name;0 Q" z; M. v: I% c1 i/ k0 Q" L5 V
Query OK, 3 rows affected
5 P$ x! }" g5 h( l8 FRecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);( n7 G4 D. b5 g7 ]
Query OK, 3 rows affected mysql> select * from student;- G& y3 p: z* @ F) W7 L
+----+------+
# G, }7 V: U0 s0 w6 `| ID | NAME |
1 ]* E5 ?8 S( }- X% }+ t+----+------+
! E/ @) c% w9 T7 R& z. v| 11 | aa |6 S+ d& z" `- ~) B8 s
| 13 | bb |5 ]6 b. a( B3 n: p& k8 \* J. x
| 16 | cc |. V3 A. _/ b5 n1 |# T- e- f
+----+------+- u0 v# b, G" S- b) B! v
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);7 o2 V% t( ^5 J. {
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
# [; [: P ~9 T/ \/ z. o( t9 P& |原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 @. ]& f2 g9 w怎么规避这个问题?
. D7 o) I# [8 J# |% _2 r再加一层封装,如下:, S, b. s4 g$ E; g% L3 f& g
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);' ~ k" r$ S" n( W4 i
Query OK, 3 rows affected mysql> select * from student;1 | R3 o+ P2 l& ~1 h2 o; v" Y
+----+------+# Q. J: u" _6 O; x6 N9 |. n
| ID | NAME |$ R" {0 L. ?) I4 @% f* `
+----+------+" C" H3 B$ D. j5 y! @
| 11 | aa |
i6 d& [& ]* x4 o0 W3 ~5 G# K5 m& @| 13 | bb |
/ _9 l, L; R# h2 s/ j8 q| 16 | cc |6 D0 k; i8 ]$ @- f9 d% i
+----+------+" { {/ p/ v: m, K' Y
3 rows in set
2 j3 i9 X4 D7 j( {( ]) n) r4 a方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);" ~% E O& q+ k) E2 B# @- |
( H5 ]" ]) G: R e5 N+ {, C; j; u- u" O/ [! N
|