|
方法1:) K/ r6 t3 A! K
1、创建一个临时表,选取需要的数据。
% V, x( b/ k$ {2、清空原表。! t3 z, `2 I) [4 }/ w
3、临时表数据导入到原表。
# |9 {7 M9 c( J) z+ R8 T" y% Y4、删除临时表。
) V* P$ ]1 Y( k+ v. K. E6 `mysql> select * from student;, d. |. Z# |6 p2 \+ v7 M4 w
+----+------+5 B! _( b$ v9 W
| ID | NAME |( ~6 x7 D! f/ e8 u
+----+------+
1 K' }0 K/ C% S# _+ ?| 11 | aa |$ h# G% M$ @! i# _: {
| 12 | aa |
( e; H0 d! a2 x( r0 L# n3 l5 c4 L| 13 | bb |
' l0 z: v/ [4 @* L% Z| 14 | bb |# T/ f) q3 k; p9 t7 |) r
| 15 | bb |, ]! y* e2 b. Z8 V. G
| 16 | cc |
# g$ e& {& D4 e k+----+------+: i: ?& T0 z9 Q5 O( ?
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;, x' o' C( _1 d3 p4 Z) c; h6 ]
Query OK, 3 rows affected
( v# F$ S8 X3 A6 eRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
. R! \$ A: I) `( j4 Q: ]: ]% qQuery OK, 0 rows affected mysql> insert into student select * from temp;3 A m7 O, ~# z, y' L2 I5 @
Query OK, 3 rows affected
: A& [" F2 |9 Q5 k7 mRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;$ @; L+ _: A1 I0 C
+----+------+
: h" v9 v) K1 Z/ \| ID | NAME |
2 L: I+ N7 {, ^7 f$ F1 n+----+------+
! z. x6 n* j5 n2 R+ h* N) W; G9 v| 11 | aa |* n% X5 m& p" u" u# d. U
| 13 | bb |& Q C X* I2 C
| 16 | cc |& h! {: M/ t7 D2 l, ^
+----+------+
, g- t6 w( s1 e4 O( V/ A4 r, h3 rows in set mysql> drop temporary table temp;( R/ c5 H& `+ D1 b5 K
Query OK, 0 rows affected3 O* d$ p& ~2 T7 Q, I
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:( a5 M% p4 h) g# [ i# K' t( J! i
mysql> create temporary table temp as select min(id) as MINID from student group by name;3 f* ^( m& E5 o9 q* z
Query OK, 3 rows affected% A8 G7 ]" ~; M0 U6 k4 y; C* @
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);4 l7 t% b& x& L& q7 v( `' X
Query OK, 3 rows affected mysql> select * from student;
( I* l: W/ m7 @0 q. A- O% L+----+------+
1 Z. \& z2 z2 L0 N$ `/ |( |; R| ID | NAME |
$ e% }0 o8 S) L4 T4 d6 K+----+------+
- x& V3 \0 L/ ? K| 11 | aa |% [* ?" b3 e* O/ C6 [2 B. s+ B# r/ L
| 13 | bb |
% G1 p+ j* N! Z- ^5 }| 16 | cc |
. L& U* S( q @$ f& x1 n+----+------+
( ], e) d" V- f4 r& |. h3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);4 f, B m5 Y# y W! ~+ J
执行报错:1093 - You can't specify target table 'student' for update in FROM clause3 q+ J& K- V, B6 c* W
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。+ y2 T+ U) k$ H. N$ Z
怎么规避这个问题?6 u9 p& S, }. z, c
再加一层封装,如下:6 w8 E4 P" h( \& b& ^) h2 t! [
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);( T6 Z5 q, @* k; l2 F
Query OK, 3 rows affected mysql> select * from student;( O: X9 b' \: R$ Y! C8 c
+----+------+8 o- S& b1 `) k! Y5 Q( I v
| ID | NAME |1 l. y# @ S" M
+----+------+
/ x/ G3 T: X e- @) g| 11 | aa |
3 J% b# G# a" i| 13 | bb |
& a9 `% [% y3 ~- ~7 p7 ?: u| 16 | cc |: ` W' S2 P) \" `; d: Z
+----+------+% [; U7 O' @6 C) G6 R$ I
3 rows in set 4 ?) }: t% `/ F) {# B1 s6 i3 S( G
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
9 s& A3 S- }/ `/ q' `% N* r# W! N! J. J7 [! ?" H |; \7 j; t$ O% g! m- c
, N. t: l/ }& ]7 y |