|
方法1:
- T. L9 r3 I' C9 [3 s& W1、创建一个临时表,选取需要的数据。
) m4 \8 n7 Y3 Y3 k' X2、清空原表。5 k: _& T* e. L# ]$ [: V! i3 \
3、临时表数据导入到原表。
' v. t$ S3 n a2 f8 y* m& c- Z5 Q4、删除临时表。2 F7 ]5 @5 ]# h. l$ n, ?
mysql> select * from student;* ]' k/ z: z5 l% i
+----+------+' D7 c% \; C5 G6 K' ?. d
| ID | NAME |
/ ]& f2 ~9 r8 [" z8 y+----+------+) c6 m" o' _; ?
| 11 | aa |
1 j& z! k" [: M| 12 | aa |( k$ w3 F2 V+ L2 r0 |6 }
| 13 | bb |
" g2 |) ~9 ?) U% e* x) V! F/ A6 L| 14 | bb |
5 w' K, y) S) o) B& v| 15 | bb |5 N; e; i% S" r. {4 O, ?$ Y7 C
| 16 | cc |
+ [0 Y0 C/ `- m7 U! W' a |' y+----+------+6 |* W6 Q$ a/ V0 f1 P/ p! E
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;8 G, Q; w/ M, b. |
Query OK, 3 rows affected5 g5 }6 T$ x; D
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;9 r9 h$ T9 J4 r; @# C0 s
Query OK, 0 rows affected mysql> insert into student select * from temp;
2 H; r) V( w' T3 H/ ?Query OK, 3 rows affected2 ~& b9 ^! s: |* x I, d2 o, w
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
6 q: ^+ y: u! V7 O! }6 K+----+------+% _) J; _/ U5 c# u9 u6 j
| ID | NAME | x0 d6 f. P+ T) h
+----+------+
' Z2 s- t0 C6 C* p# ?5 a, X9 c6 a2 m| 11 | aa |& B# G r, D/ t# T; g2 f
| 13 | bb |
8 y, d* l! T. s8 D0 q6 x L& Y) {5 y| 16 | cc |: U- ?" `* V M" w. |* P
+----+------+: r$ }# h0 P. r! L! V0 p
3 rows in set mysql> drop temporary table temp;
* e' @# w C' I5 V- ^! H- H% L; hQuery OK, 0 rows affected0 c2 T' K9 p+ t% V
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
1 ]) l, Y0 q- H* T( V! U$ U: cmysql> create temporary table temp as select min(id) as MINID from student group by name;' E9 _& ]6 j5 i
Query OK, 3 rows affected' P* J* K* Y5 l) y# d8 |1 w) c
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
! I3 a6 v! {6 n( `5 NQuery OK, 3 rows affected mysql> select * from student;
% c( O/ o: a8 ~2 o L+----+------+
: T3 r$ C4 l/ S| ID | NAME |" c1 V- R$ O g+ i& r& V
+----+------+! g7 Y- V, T% B% z8 D) |: y
| 11 | aa |4 T" y9 |* B+ Q+ z1 x, D/ i
| 13 | bb |
/ l# x" \; T+ y3 P| 16 | cc |
: L: M. {& [3 f7 j+----+------+
! [8 O. |# A" z: W' y3 j7 w" b; a( m e3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);$ B) ^' R, Y8 T/ B: P# M$ j' E
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
+ {6 }6 y1 v2 G原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
0 a0 W+ r! Y A/ C怎么规避这个问题?" ~. Z H& `# \# y
再加一层封装,如下:8 l5 C; D6 z; z# S& }" a1 W _4 o8 j
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
j' u' X( L6 f% @Query OK, 3 rows affected mysql> select * from student;+ A @# g; i* _0 X: x+ p9 o! W
+----+------+
/ O+ j; k* Q$ P: Q) }| ID | NAME |) o9 N0 G- m+ t
+----+------+
5 m/ h7 X4 T# ], c| 11 | aa |+ B8 [* n6 f7 u# L+ N
| 13 | bb |; O' m3 |$ h9 i# n. l
| 16 | cc |
' q" I5 o9 q# h8 \* r& t2 C+----+------+3 \5 X1 T5 X: |5 |4 e( u: x( q
3 rows in set & O/ B2 \! C' g3 P
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
! n* O+ C! M* L- W& W E! C. Q$ u- N( j4 k- l4 [
+ |% G/ ?9 P Z: d( \, r6 O, Z
|