方法1:
4 }+ H$ h' P$ ~! G1、创建一个临时表,选取需要的数据。
0 q3 K+ w! J+ k; }0 }2、清空原表。8 g S* N+ Q/ k# X* n) {
3、临时表数据导入到原表。
$ u; R+ S G3 r( s$ b% I4、删除临时表。
|" K2 l% Q3 ^1 t6 Amysql> select * from student;
G8 K0 n4 g) z: A+----+------+0 \! `6 n' N, d: ]2 J+ |
| ID | NAME |6 l+ B6 C8 M/ e, A1 w
+----+------+
) P3 A) o+ u/ G, }: N. a% W$ u) J) h| 11 | aa |
5 R2 `8 q/ U, [" K7 [8 d/ L2 f| 12 | aa |5 k! D* S8 f9 B9 R/ K
| 13 | bb |
; o* b9 n. f/ J; w, }2 \9 q: w| 14 | bb |
' k& h% e$ w; ?. t| 15 | bb |
# x- T0 ^. G7 V& x, d9 ]0 a) I; w| 16 | cc |9 X# r) t* Y! {0 Z% q# N, M
+----+------+2 U& n( ^" n- e& i& ~3 T
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;- y9 T" r8 }; N* Y
Query OK, 3 rows affected$ Y! d6 E' b' U$ U
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;; y3 L8 l# o: q, q; h$ n2 x* f
Query OK, 0 rows affected mysql> insert into student select * from temp;
) a: |5 O0 K, U8 [( gQuery OK, 3 rows affected/ F x* z+ j/ H6 a
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;$ T) w. f! D& H
+----+------+
! z7 ]5 c' a( u' i8 T* B9 t: q| ID | NAME |
/ m/ H/ m. P6 z2 |9 [& U ~+ ~+----+------+4 T; T' |% R: M2 d" ^
| 11 | aa |
) }1 l1 A! n' z( ?8 ^' R8 u| 13 | bb |
+ {8 Q ~& J7 |$ W$ D8 ~, [| 16 | cc |+ W8 P0 S. q% W% H9 G& _
+----+------+
5 l( `3 P4 H2 w9 B: d N4 d3 rows in set mysql> drop temporary table temp;
1 `2 {* ?' s0 d( M/ @0 ?# {Query OK, 0 rows affected
; h0 B8 r2 H( D6 T这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:9 c0 W" [0 E% g
mysql> create temporary table temp as select min(id) as MINID from student group by name;6 W2 x; o9 O& a# @2 }/ ~# E" W
Query OK, 3 rows affected/ e+ c. W& `7 f
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);- Z5 w' k5 {( \8 W9 [+ Z: e5 {! |. t9 E
Query OK, 3 rows affected mysql> select * from student;! |4 {. t. i% x, X. \; E
+----+------+0 T a- L% z# ? M4 g$ }
| ID | NAME |
7 t6 C" r( J& j" O& F, X2 ?+----+------+
+ A* o7 y7 n% j, N) T; y* p+ ?) h& `| 11 | aa |
1 m9 J# i& r% w, e' U, y& o6 N| 13 | bb |
3 a) y0 Q0 v0 S| 16 | cc |
7 z/ E4 \0 }% B+ T+----+------+
. g% Q+ d' @. S% Z3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
; f( C7 P( ~8 d6 B" h) v S执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& C6 @ D7 ~9 v原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。. t3 S( M! E1 J6 a7 P
怎么规避这个问题?6 n/ J* X1 @+ d: ~
再加一层封装,如下:
+ p4 w3 J8 V9 m' Fmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);1 u/ @/ u0 B+ a# B+ [
Query OK, 3 rows affected mysql> select * from student;2 @, z' {3 t# f7 T0 L
+----+------+9 m/ |0 f5 ] z/ I2 K4 v
| ID | NAME |
6 y$ g1 ]- x! X; W+----+------+
( I3 @3 e3 P& l: Z" f+ ?$ y| 11 | aa |/ S+ @1 C* o0 w6 F: p" g& C
| 13 | bb |, s }5 Q" Y# n
| 16 | cc |: ~; n& P% F: r- {8 U3 ~; o
+----+------+
$ i \' G- @( }3 rows in set 0 [* m" y- I7 [
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);1 F7 b4 H8 H- T3 B) U( M) S
6 [1 _6 l1 N" Z; @
; s" Y1 w4 R, Z( B k% q |