|
方法1:
3 m; z( o$ [) N& e( \; `9 s1、创建一个临时表,选取需要的数据。4 H: Y( t7 |8 q
2、清空原表。' P% s- o) q q" y- ] e- Z
3、临时表数据导入到原表。
# j Q: w) Q' q4、删除临时表。- q6 z* w* P% S* J
mysql> select * from student;/ E$ G' }0 u( @- g0 M
+----+------+
5 w! N% G+ Y9 B& E- F- R: y| ID | NAME |0 C8 a( E6 b8 j: Y* |
+----+------+! S2 Z+ O0 J5 b6 k
| 11 | aa |5 \, z3 [, t/ n/ \$ Z. w
| 12 | aa |
t f: m1 ?# m4 b9 H+ n| 13 | bb |+ C5 r! g( ?2 [6 y
| 14 | bb |! K* J+ a/ K) R' [2 O. i
| 15 | bb |3 M8 E/ n8 V+ S9 V3 \; Y1 E+ q% O
| 16 | cc |" i& Q6 R6 y. a" G. I6 t
+----+------+3 a8 ~. i1 X% L
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;7 n; B# g9 |3 H7 i6 i
Query OK, 3 rows affected" ?) e! H5 S! j! K
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
. i5 T! Y. c6 q( E& jQuery OK, 0 rows affected mysql> insert into student select * from temp;
) v) T% d0 y9 C3 rQuery OK, 3 rows affected
5 Y; K' @. |5 W6 n/ q* DRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;# J; p% p( E5 m& b
+----+------+
' H" ], Y; F' e! P) D) T| ID | NAME |
3 f+ L0 S4 W" y+----+------+
8 f3 o) L/ N* a; ?5 k| 11 | aa |
; h+ I: a+ x, D1 b6 }" S: T8 g| 13 | bb |
8 h. z4 A2 Z# i9 c; Q) |, C3 ~| 16 | cc |) Y$ H' }/ M8 t3 P: E7 S, y
+----+------+
( n# Z p8 E& J- ]' \3 rows in set mysql> drop temporary table temp;
7 B/ }4 J8 c% D7 ~+ N% MQuery OK, 0 rows affected# S& g9 Z& i& g2 ^- l5 A/ d
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:- o3 ]$ {0 y% ]
mysql> create temporary table temp as select min(id) as MINID from student group by name;/ }0 j8 D: r/ E
Query OK, 3 rows affected
% o( `- F! ?* |7 l. ARecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);5 o i) C( R8 b2 G! i; f6 F
Query OK, 3 rows affected mysql> select * from student;
# n# l8 l% u3 T' i1 L+----+------+0 Q% I- A% d5 N- P% e
| ID | NAME |' N9 i# V! F) ?7 h Q/ f
+----+------+# _! Z9 ~: l7 o; e# Q! s4 K
| 11 | aa |( Y- L( b0 [! H% N. q& l. [" H1 T
| 13 | bb |' X. C: S6 B/ F2 c% |
| 16 | cc |% a- c7 _: _8 b
+----+------+
2 c- Y; H+ U$ }. |/ F3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
2 T5 Q! l7 B+ B E9 Q7 L执行报错:1093 - You can't specify target table 'student' for update in FROM clause
' S3 D, U9 E& P原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
0 k( Y/ ]$ k1 ?" E+ s; M怎么规避这个问题?7 N! h( v1 C* N' l5 }# U
再加一层封装,如下:- C5 O$ b, Z# E
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);! |$ o) V6 X9 y# j R
Query OK, 3 rows affected mysql> select * from student;3 F2 e% D1 B, w( M
+----+------+' D. J4 [, D5 ~+ O3 c
| ID | NAME |- F! p# t0 z9 x7 a0 \5 J& P
+----+------+
" c% X* c' Y1 y0 N| 11 | aa |
. U, a' ^' P% ]" s5 r| 13 | bb |2 C) ]& Z$ p) C8 }
| 16 | cc |: P) s+ V* m$ P2 E, B: ]
+----+------+
9 Y2 u+ v0 s. v) n- a- R) T3 rows in set # @; x3 P( Z- Y' J8 H K
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);/ P7 o6 ], C& u! _' e$ P% _ h
: \$ x: x+ h( r% ?1 n N
- Q: ]0 i8 ^3 o8 N: j |