方法1:( |6 V! p8 S( B* D# V
1、创建一个临时表,选取需要的数据。. ^; ^+ N6 {, F# k. R( p
2、清空原表。
) @6 u! w+ U T8 \) S3、临时表数据导入到原表。$ G/ N' ~8 X' Z) { ~. K
4、删除临时表。
' p2 V- `) }8 gmysql> select * from student;
$ n; Z1 a D c1 T+ j5 o% X+----+------++ M/ z. q9 R! D T$ N3 D
| ID | NAME |. h% W( A; ^4 |- S" S; F
+----+------+
+ ~, x+ K9 t! ]9 R6 }! ?7 L( W| 11 | aa |
3 R2 J5 ?3 o) G. s9 V. K: o| 12 | aa |- h" ^- \$ U; D# C/ D3 l
| 13 | bb |
$ ~( d7 _/ C" _ c| 14 | bb |2 P; O. a% j8 K! C- z
| 15 | bb |, ~5 E. G+ u6 T, k( ~
| 16 | cc |" J6 K; k4 r$ F. p) [
+----+------+% p# o, Z5 ` ]1 M& U# r! ~
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
4 ~5 j: N7 N. f- Y5 u5 w% yQuery OK, 3 rows affected9 d# i! L1 p2 f9 Q
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;" Y: S7 G) Z( j2 p% Z. M
Query OK, 0 rows affected mysql> insert into student select * from temp;
% w' v* A* P$ @" {# q3 J! CQuery OK, 3 rows affected: |. a* w! _- v" G1 @2 i V/ l
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;. [4 L$ T# H) S& O1 q
+----+------+8 Y0 K8 v4 d* s9 J& [$ E( ?. o
| ID | NAME |1 J" |, |5 R) ^ K' a: g
+----+------+
' O8 D, ~1 }0 || 11 | aa |
0 ^0 q* O" h$ n* d) u. M" b| 13 | bb |! P' z/ j4 z( f2 N
| 16 | cc |
: f, p5 E8 s0 w+----+------+* e X$ k" ~* I' |
3 rows in set mysql> drop temporary table temp;, ]! ^8 U$ k9 | Z( r
Query OK, 0 rows affected
& `. P: Y) P2 ?5 X& E这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:) @/ D/ D4 m2 b* Y" Y& y9 p
mysql> create temporary table temp as select min(id) as MINID from student group by name;
9 x d! T- z/ ^; D2 ?6 JQuery OK, 3 rows affected W6 {% @2 K" t
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);3 ?1 I* _) r3 g! A
Query OK, 3 rows affected mysql> select * from student;
8 E9 z, p5 u u+----+------+% e# n! G m$ w4 ]' K& z
| ID | NAME |6 W2 A* p/ p5 E& n+ C! g9 K
+----+------+# t, J" V! T$ J& i
| 11 | aa |! }8 c" r4 ~! p- J& O) v5 ~7 k
| 13 | bb |( G9 L4 q' ?1 J. G X9 A
| 16 | cc |
' J% ~" K" h9 Z% i+----+------+9 q+ y" m$ I! d* R) k" }4 t- R; \
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
* ]8 a' F: P% l X执行报错:1093 - You can't specify target table 'student' for update in FROM clause6 u5 P8 o9 M7 D4 k# {( j& L- k5 W
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 a- n7 J; k$ d9 [; x怎么规避这个问题?
N/ O/ w: A8 N1 l+ v8 b再加一层封装,如下:( k( ~5 S$ a9 A
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);* {4 h) `0 v! B' _+ B [
Query OK, 3 rows affected mysql> select * from student;
) ]2 k( M) o1 F* P$ ?+ o: B, N+----+------+- ?2 `; _$ _; e: d# U; _
| ID | NAME |
W8 f' n, ^% L! w+ T& w+----+------+
/ o8 |2 U8 S$ I' x3 V: `| 11 | aa |
' m# R7 t+ i7 J6 _1 {7 j. L `/ k| 13 | bb |; _ V& k3 v! I1 z1 ?8 T
| 16 | cc |/ b- N; T W1 \0 X' S
+----+------+6 k; v! u3 q9 B( I& a+ j* \. o
3 rows in set . H8 m+ R; E0 b. o. H
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
' U; Q' L7 d* L$ l+ [' V) L3 `
8 @$ R7 o. V" L3 Q2 x7 F
|