|
方法1:
P; s. H, n! ?& u% m: Q1、创建一个临时表,选取需要的数据。* P7 g$ X" A8 w
2、清空原表。
9 S0 A0 ^6 U |3、临时表数据导入到原表。
* V& e- O: N1 P0 N4、删除临时表。
( j7 q9 ~ f! umysql> select * from student;4 k, R" ^; L! l* [1 \" A- Z9 v
+----+------+8 k; w6 a* t3 A, v/ K% @' L
| ID | NAME |
- D+ ]; k! q7 F- y N+----+------+
8 N% g9 n$ O! e7 f5 r/ ~, e+ H) q: f| 11 | aa |
" ~4 o5 f& \7 C" j| 12 | aa |
8 W8 {- M4 K: W| 13 | bb |' a9 P; ?, T. S$ D
| 14 | bb |6 f0 H9 H* S1 o) L: U
| 15 | bb |
- E c" |) |! D w! }| 16 | cc |3 O. b$ q7 L. G: u' o3 V( G
+----+------+
7 Z! a. B% `* a. |6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;& `* [, H0 w( G& [ [
Query OK, 3 rows affected
5 D9 P" c" y: a$ e% u! \1 L3 h1 ARecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
* y: h; p& D6 c* t0 d+ sQuery OK, 0 rows affected mysql> insert into student select * from temp;- m1 e$ J$ Q( w# o2 s6 r- u+ P! k
Query OK, 3 rows affected' D4 g b5 N; h$ H7 M6 V
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student; @% s4 Y5 r0 h' v
+----+------+
0 ~3 ]) e* h& T: k- v' R/ W& Q| ID | NAME |
+ u/ Y# y% W1 W2 f2 D+----+------+; s! G" Y5 g: W6 T7 v7 @
| 11 | aa |8 M/ q* B/ `- d! q6 y0 i0 `
| 13 | bb |
- }3 \* F0 P. j3 B0 y: R" ?+ F| 16 | cc |
1 W% L( d% D* ~2 \$ G+----+------+5 C( x1 S. p" L% l& s
3 rows in set mysql> drop temporary table temp;
8 W1 m2 X1 s8 \, X$ FQuery OK, 0 rows affected
% @' K1 d- ^6 ~这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:1 d9 H1 q- i! r/ ^
mysql> create temporary table temp as select min(id) as MINID from student group by name;
4 u- q. {' i1 s, i& r& qQuery OK, 3 rows affected
' d6 @ _1 u. z! HRecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);! v2 K# g) q5 }2 r1 ~
Query OK, 3 rows affected mysql> select * from student;6 ?/ I+ I9 H- E; x f$ W. J, a
+----+------+; U! a, e; B: m. H0 m, ^
| ID | NAME |
) H- x8 H+ k) P% g. s! j8 w- ~+----+------+
3 H2 h" M% W6 y2 g% @| 11 | aa |
9 o* D( T. ]; }4 m X* }3 C| 13 | bb |$ y' A/ i1 |; d! w6 @ f
| 16 | cc |$ Z6 P5 E' f2 D! O6 S
+----+------+
0 u9 h4 N$ |8 k3 v3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
1 i4 E4 V: D- X* i执行报错:1093 - You can't specify target table 'student' for update in FROM clause) g: p1 s- ~/ y# p
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。' t' D( b: F) w0 Z, Q" _1 r1 E; N
怎么规避这个问题?
7 e# b9 E- O E+ D再加一层封装,如下:4 r ~. K' o$ ^9 ~% g8 y
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);5 k6 N/ V) y' g6 G0 ^' e$ I
Query OK, 3 rows affected mysql> select * from student;) v# I* j6 ~! S" X9 ?2 F
+----+------+; {5 F) ?7 B2 Z q/ c6 s k2 w
| ID | NAME |6 u. W0 {# u" _$ `. s
+----+------+( L) N7 T/ Z) C" s$ D' a
| 11 | aa |2 x7 A. ?' s1 Q! w; F6 p$ |
| 13 | bb |% k j8 |: J/ [
| 16 | cc |
% l8 d$ t; Z1 S) \7 L+----+------+* ~4 r7 D, p$ }% }; G
3 rows in set / J$ O9 x, h @8 L( s4 Q* y
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);, R3 J8 L/ J# ^# {' g
+ ?& s/ k H, D b3 G" \; y; e8 K
1 t$ W7 h% R) ?% Y# ?4 R0 G |