|
方法1:
# N, w2 e3 ^/ ?) R1、创建一个临时表,选取需要的数据。. ?' u' t& o; s) v( }% ?
2、清空原表。 X* b6 v; @$ d+ p; p5 R( c
3、临时表数据导入到原表。
; V* ^# L2 E3 A# F9 A, x( ^4、删除临时表。! w; \- L8 n% \0 M. E4 g6 I
mysql> select * from student;
& j& j- \) v( j0 ^$ @4 z% N g+----+------+, p- }0 x: ?1 w, P; A; g
| ID | NAME |/ @6 B0 ?% T0 r8 }
+----+------+
1 t; U5 f# L. [6 J% {| 11 | aa |
0 B4 F" p: w1 b| 12 | aa |
" Y/ j4 f' N& R6 p; a| 13 | bb |! `6 |0 k0 S' y$ b
| 14 | bb |
, j$ t" ~; A: j5 o| 15 | bb |
2 a" U! A, G, T| 16 | cc |
7 l- Z* f* ^ |; \5 k' i+ p3 U+----+------+/ @ V& b( h( G# r; A- \, \
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;: ~* f" m# A! F: M) }- c
Query OK, 3 rows affected
$ ?5 a. [8 s, n2 n% d9 [Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;/ ]* E3 G( L, l# t$ W! I
Query OK, 0 rows affected mysql> insert into student select * from temp;
2 C5 w- w! j! d3 h$ WQuery OK, 3 rows affected W8 i8 s2 t$ h# ]' S" y9 v, }
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;: d& R% E+ ]" L( x! H1 `
+----+------+
5 b' {- q% Y; y| ID | NAME |1 O# Y# r1 K- Y3 t+ J% C( {. @
+----+------+
5 s+ l1 I. N5 E) K) q) V5 \| 11 | aa |
$ H( O. Y. {2 H2 ?| 13 | bb |
. n2 j! `- d; L. q8 w' {$ V| 16 | cc |1 F) X$ @0 ?- p) s I. h4 S
+----+------+
- ~5 u! g( ?& H7 ~3 rows in set mysql> drop temporary table temp;% C4 l5 m# U0 w. k! G. j
Query OK, 0 rows affected
6 m4 j1 x5 F" c+ t/ N. a$ m) p这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:2 x( G- H4 X4 A! B& d
mysql> create temporary table temp as select min(id) as MINID from student group by name;
8 P; I2 ]* X0 ]. D- sQuery OK, 3 rows affected1 u$ j+ U, ~- A2 f) i
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
2 R5 K( _0 o4 S' _( xQuery OK, 3 rows affected mysql> select * from student;
; v7 B4 i2 D' e5 {0 d4 [: }& |$ `: o+----+------+
6 ?" s2 r- Y, b$ f3 `9 W# }8 ^| ID | NAME |
- ~, Z* F" W6 _- B" S: h1 N+----+------+
' h; a; K$ s" _/ H0 v( X| 11 | aa |
/ {. M8 N O. s4 G2 u* h$ b8 r| 13 | bb |
1 a {- [2 F9 {. d3 m6 H) x| 16 | cc |; \" a* J& G% X2 F) q2 R+ i B9 r. A& }
+----+------+
+ o7 j; Y) M1 e0 u3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);% L2 z5 q$ U* z7 N9 l7 o$ p
执行报错:1093 - You can't specify target table 'student' for update in FROM clause, F: E. }+ D, x& E1 A3 n
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
' ^% r2 m, Q& u& Y- B怎么规避这个问题?
~: n( [3 d) t' [- B& r8 @1 Y" V. @再加一层封装,如下:/ u6 k$ J5 k2 H6 D4 d# O7 w
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
' l! O" Z' B' O& L9 _3 {5 yQuery OK, 3 rows affected mysql> select * from student;
* N1 ^3 o. P3 D+----+------+& L7 P; U2 `* G6 {
| ID | NAME |2 {+ N( N, |: u% _! m2 m+ e
+----+------+
, w% r1 L2 j+ d/ I| 11 | aa |
8 P+ E1 c4 ]2 S [+ H| 13 | bb |* I/ {/ d0 O" k$ e$ q; I) n2 j- X
| 16 | cc |
! S: j4 g) \7 \+ w+ p+----+------+6 R e; | C6 T. Y
3 rows in set
& V+ ^* X- Z7 z( C! B" {6 }+ k方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);, p! ^ y+ A2 ~9 b6 D: A
0 J- m9 ~" z( x4 q% A1 s
7 I1 r- u$ l1 r* H) C, w
|