|
方法1:2 f2 f: i( l- f, Q- e Q& S) c
1、创建一个临时表,选取需要的数据。$ S. W3 q" z5 y- L7 F, ^& \
2、清空原表。
0 P2 U n; a3 K; _- T3、临时表数据导入到原表。
7 k; Z5 ^1 J4 c. z' J$ p4、删除临时表。
9 |; X/ ^% N/ d6 M5 y( v1 Fmysql> select * from student;
( f$ [/ F: p) f; e3 o2 Z3 f$ U+----+------+) s0 d3 O- L6 K; l) N& z; G# G
| ID | NAME |6 G9 y; L' \- b7 {& ]
+----+------+
8 s) v+ [2 p+ H; t6 {/ e| 11 | aa |
* r+ L# `& P) E& X! }| 12 | aa |( |& U" H5 h7 ^, D
| 13 | bb |3 `3 e6 X [4 k7 ]/ J
| 14 | bb |2 Q. f. ^" w, q' e
| 15 | bb |8 Y8 X' h; @) L! f; ^
| 16 | cc | `6 [* m& T. y
+----+------+! i, Y- X* `; v% x3 t" j
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;& {; K; h* N& T' b2 D
Query OK, 3 rows affected4 V2 `, d3 k+ D0 ?% d+ E4 \, `
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
* E7 n8 ~2 {! u" |( G2 pQuery OK, 0 rows affected mysql> insert into student select * from temp;2 _* N- C4 p. N; j
Query OK, 3 rows affected8 U* A4 K4 a2 n; Q6 z" T
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;7 U# L6 \1 A4 G# E9 A
+----+------+/ I n+ \1 t: y/ E
| ID | NAME |2 {, `+ V' c& d% [1 L) F' b
+----+------+9 g I" |$ _. T& M7 G
| 11 | aa |
( s& X3 z1 p# p$ S6 `| 13 | bb |
- j8 q$ l9 E/ w" ^| 16 | cc |
& [: x! r" _8 `$ f: D# M' L$ G- B+----+------+
# H$ d! l0 O) u# E9 \- k1 A! V3 rows in set mysql> drop temporary table temp;; @* b, W2 d& a. a% E
Query OK, 0 rows affected
8 a6 Y j3 ]% L7 i- f# K这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:0 K1 `0 R( h. Q* O) u* Z
mysql> create temporary table temp as select min(id) as MINID from student group by name;- ^ B: x: n( q* r
Query OK, 3 rows affected
# [& k3 N3 I7 t1 }+ `Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
* u+ q- f( N# A! f5 n6 FQuery OK, 3 rows affected mysql> select * from student;
" [* x9 }. B, R9 N5 X% P2 e% s6 G+----+------+
; D, x5 |) d' a: r* c5 Z| ID | NAME |
, I2 d) Z' H/ }4 A$ W7 g& _+----+------+
* Q: f3 y5 _6 x$ A| 11 | aa |2 M9 v$ d2 y: ^/ [6 y
| 13 | bb |1 u/ |: H: }0 Q$ k: x. g' k
| 16 | cc |. e4 Q7 k8 m4 ]) G
+----+------+$ ?3 b# H ~' w9 V ~
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);( U! c9 K+ t/ M; o: \8 n
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& `. J5 u R. D# d" B' [- o原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。1 Z( Y0 X) c; q" z
怎么规避这个问题?
/ O$ J1 b2 G' K1 F& ~ u# U* l# X再加一层封装,如下:
% B+ R5 q6 [0 C+ {6 x/ `- Smysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);3 K" H- p% i7 h5 W
Query OK, 3 rows affected mysql> select * from student;
% F% X) f2 A3 t: S+----+------+
% w* c. v; ]0 J| ID | NAME |
' ]( ?" i! J4 ?: `+----+------+
8 @: C5 g0 h9 P6 Z& w, q| 11 | aa |1 K0 d* N0 |% Y# E8 W1 g
| 13 | bb |4 g. J3 `( z# s
| 16 | cc |
9 ?" k. |9 R( g- ?+----+------+
3 H6 J R- K/ z& b0 _3 rows in set
) |2 J3 B9 T& D$ C* }3 N) r9 Z6 I方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
) ~" V/ J2 z/ b- W! j; L% V
& B: g1 u8 H. y q) z
4 C% Z- h( S5 ?1 X% S: Z |