方法1:
: b9 }! O: P7 v8 D1、创建一个临时表,选取需要的数据。) _( h0 V; W# h( V3 ?1 i
2、清空原表。1 t. g5 y6 f4 S0 b. S4 S
3、临时表数据导入到原表。6 h$ q7 M. w+ N& O1 V+ B. h
4、删除临时表。
$ u, A! M! t4 c9 W: Q* \mysql> select * from student;3 H; {- K$ t* n& A7 |; K0 u$ v
+----+------+: A0 ]" E8 i( `" r
| ID | NAME |3 V8 n, r7 {6 b/ a
+----+------+: h* G2 S# ~9 F' M z, O n
| 11 | aa |
, a6 `) U& e* N5 y* i| 12 | aa |% V% ^5 N" N4 n
| 13 | bb |( n) t. q1 g t6 T
| 14 | bb |5 C( N! D0 ~& V, ]. y
| 15 | bb |1 m& b' ?# ?) p8 g8 J, \6 F
| 16 | cc |
& ^$ e) T7 d, n6 D6 i4 x1 Q+----+------+
, T+ `& Q6 y9 e8 e2 N- R9 x* u6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
K+ }7 r; N( x6 Z" l* v# n! k6 dQuery OK, 3 rows affected
: W }3 J9 u/ `; cRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;: A9 D/ O' u4 l$ ~- I
Query OK, 0 rows affected mysql> insert into student select * from temp;
) F. u: h" X/ @' W. d0 xQuery OK, 3 rows affected
) e: c( a1 E# b: ~Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
0 D$ J: L! J e/ _! P1 i+----+------+2 o- V1 P) A& i9 h6 o
| ID | NAME |% D8 f3 ?( M9 s
+----+------+
+ d* s, a" C9 y6 T' l( R' e0 R- @| 11 | aa |
# \ q8 n9 _- \| 13 | bb |/ [" f( q% t+ B. \8 Q; F. r7 a
| 16 | cc |
/ U U# n2 j4 n+----+------+( m6 P2 q1 y" _( H2 j' F6 @" \. C
3 rows in set mysql> drop temporary table temp;
& }; q* D/ A; b; v: gQuery OK, 0 rows affected$ b1 x8 E& p; \
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
$ u3 i- o' T1 K+ hmysql> create temporary table temp as select min(id) as MINID from student group by name;4 ?( ^0 z% S( ?4 N, C* U2 s; m7 b* m
Query OK, 3 rows affected
9 G2 f t# W& t" v: r b- SRecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);. O9 H9 t4 o) r
Query OK, 3 rows affected mysql> select * from student;
* @7 b3 D; _' e1 W! ?) o( T. W; ~+----+------+
8 D0 {; h7 i- Q| ID | NAME |
/ M3 ]( J% J: r+----+------+, ?2 t, p) A. m1 d! b* v# a. u
| 11 | aa |2 [& @" t% t" j1 H
| 13 | bb |( m6 e2 ^7 m8 E8 w+ D% d) M
| 16 | cc |: u8 y$ R b' e! g9 r- B
+----+------+
# B% M% N0 P p; ^( f3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);" m/ z* i0 f$ Z7 h7 @: V4 a
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
, X1 ]; D9 R; z0 o: e原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
6 w, B0 I3 f) U怎么规避这个问题?% u$ V# i% \% B. q& U* n
再加一层封装,如下:$ n2 i4 m( j9 a% y( o# M
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);# o: T' R1 H# h0 p' w1 j8 z
Query OK, 3 rows affected mysql> select * from student;5 e% W. M! w/ O
+----+------+ z! n0 [$ I! I3 K
| ID | NAME |+ i$ H# \1 t! D* E
+----+------+
3 `* |6 b$ w' y& Q| 11 | aa |5 U e* m4 j& q9 y c. Y! c
| 13 | bb |
3 {- O2 n0 K/ Z/ b| 16 | cc |
3 \/ x* R/ D+ v* y5 J+----+------+! x& w. K" \1 ~- I$ ~
3 rows in set : e* V/ i8 s _: b
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);- G/ b$ J$ r8 F2 R$ r b; J
' u9 u# a q- y; G
- S/ O# ~$ _) y1 |- j |