|
方法1:
6 `7 R7 s, X' v; a% g$ w2 t4 o% j1、创建一个临时表,选取需要的数据。' Z' v, ~' g7 Z( C$ v! b5 k. x
2、清空原表。! T- o4 v2 Q( O9 ^
3、临时表数据导入到原表。
6 l/ i* B1 V: M1 V4 w- F4、删除临时表。/ S E4 v" c7 R0 ?
mysql> select * from student;# }; S( u. F! j
+----+------+
* u1 B; X3 r+ T* E1 ^2 O| ID | NAME |
& G# v) R: D" R4 ]3 h; H2 Q! @3 }8 o- x+----+------+, W! G% c- Q- v( Q+ {1 X0 v
| 11 | aa |+ G1 a' j; y9 M
| 12 | aa |$ c+ R+ S- o2 H9 V, {! O
| 13 | bb |
2 \0 M' \+ Z( G( x* T" i| 14 | bb |
7 c% Z8 L& V c3 x| 15 | bb |
7 y6 ? O" P# L3 H) M| 16 | cc |7 W0 z/ R% y$ ^8 L" A
+----+------+
8 H, c9 v/ `) x* B0 r _. E6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
: H: Y) U7 s$ Q, ?# SQuery OK, 3 rows affected" J. R) t0 H9 g7 _
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;/ G* k+ y' h5 A9 Q, P" D0 t
Query OK, 0 rows affected mysql> insert into student select * from temp;
' j# c+ G3 ^( f4 V6 }, qQuery OK, 3 rows affected; A- v9 m! m5 d6 S1 P/ H# b
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
3 w' N; q( h7 J1 p+----+------+
* n! v9 P2 c5 `| ID | NAME |
$ v0 G, ]$ K/ [+----+------+3 i. u$ m% k3 `+ o9 I! Z" V
| 11 | aa |
" P* t0 G$ o4 r" N2 X1 i| 13 | bb |; x$ S; ~; {% [ v( F
| 16 | cc |. o5 |) R1 N( `0 I$ o
+----+------+
( l! [# K# u: H% _" x2 {3 rows in set mysql> drop temporary table temp;$ w, G$ Z1 L, Z' v! ], u! w
Query OK, 0 rows affected! u0 `8 R5 D0 K
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:$ ?& s/ }6 m: I! ~1 D
mysql> create temporary table temp as select min(id) as MINID from student group by name;
% Y6 x5 k6 u& c9 A* vQuery OK, 3 rows affected
# s! J9 F& ?) D) [* e/ XRecords: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
1 Z- e8 C) G1 ?" oQuery OK, 3 rows affected mysql> select * from student;
& Y* |4 P @) f6 J( B' ^" n+----+------+2 b `6 J' ]1 H l
| ID | NAME |
, I3 |# k" w2 n& C( r9 s8 S3 X+ R7 Y+----+------+
% ?0 g, m% W5 [1 V| 11 | aa |) S% z6 A3 O2 c! h& r
| 13 | bb |
4 t1 S- f% k h| 16 | cc |! `* f( q7 l! v+ c" l+ ?. Y) z
+----+------+6 H" d4 ], Z8 m5 x* Q. I6 M
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
; Q2 J# C% D5 Q) r( S+ K/ `( \执行报错:1093 - You can't specify target table 'student' for update in FROM clause
2 x) b; U6 I$ ~' j原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
7 Y$ F6 d; \( A6 [8 t怎么规避这个问题?, m" I$ J$ K1 d# v0 g5 w/ S
再加一层封装,如下:* j) D* F9 r' G, V% [* B( b
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);/ C6 Q" ~' H9 e; J# }* r
Query OK, 3 rows affected mysql> select * from student;: F4 A4 B- ?$ W
+----+------+ _2 d" n* U3 A3 y( P
| ID | NAME |
) c( b2 I. i8 S v# R- G+----+------+
, h6 z/ @0 E2 H| 11 | aa |
' p3 B u8 d: P8 v0 N1 F! y| 13 | bb |4 }: ~. ^" m! Q+ W+ `, F$ {
| 16 | cc |9 ^* u8 ]6 Z8 a4 }) \
+----+------+
' N, v2 u% {# R/ i' h0 J3 rows in set 1 t$ R% d( Z' s5 X
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
! a4 G2 g7 E" x' {8 ^- l0 ]3 ^. _" Q; w# s/ ~
- e) Q- o N' p Q
|