|
方法1:" j$ T% |, T9 R P" M9 U8 @; @, \
1、创建一个临时表,选取需要的数据。3 }. C# I7 d/ A) p0 V. s
2、清空原表。5 X" I2 M- b) @2 A" `7 S
3、临时表数据导入到原表。7 a2 O( r( U7 d5 g2 T% { |
4、删除临时表。9 X+ }, u+ m9 P4 v. n
mysql> select * from student;
( U. H7 [5 m4 w n! {% Z1 o+----+------+7 f$ G" q( L3 g# y
| ID | NAME |$ ~9 B2 u4 ~, ]9 A' X3 N: `9 S
+----+------+" }) ^& G% ^% |8 t+ g f. ~7 E( Y+ Z! E
| 11 | aa |
0 p) V' H _( w| 12 | aa |
6 q( g; _7 C5 L* C: c| 13 | bb |
! R A9 P! x- R. U* y| 14 | bb |
2 h8 t9 l8 N9 {. s% k| 15 | bb |; d4 _6 Q1 J" t1 L2 e ^0 B
| 16 | cc |* y2 e2 _: V+ _
+----+------+: W' q; F' R+ {
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
, W. l3 b) E5 g: S, p8 _Query OK, 3 rows affected" n c2 {$ [/ J; s& d6 a/ f" M# s$ l
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
# e: }' a& l" e8 Z' VQuery OK, 0 rows affected mysql> insert into student select * from temp;
( ?2 ^5 |9 e2 V( ?1 }" \2 @Query OK, 3 rows affected0 @/ j" h; j9 `, w. A& w/ o
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;2 m, z5 v/ p7 T' Q/ o) d
+----+------+
- W+ I0 R! t) y) k0 W- C+ y| ID | NAME |' i% |% p0 Z: i! d. Y
+----+------+
- w2 }" v7 Y( I1 V7 _' r| 11 | aa |8 h& D+ q) w/ r! p
| 13 | bb |
# W+ h) v( s1 c ]# ?| 16 | cc |
6 @0 o4 O* J5 O% c |5 R/ d: O+----+------+
- f6 m$ S7 K" v6 j: c# H* H3 rows in set mysql> drop temporary table temp;% i5 T/ h, i2 L( M( C
Query OK, 0 rows affected1 r& o S9 l+ c0 I7 ~/ B, ?
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:1 V- D7 Q. c l
mysql> create temporary table temp as select min(id) as MINID from student group by name;9 O4 u7 J+ f' x% v" f
Query OK, 3 rows affected3 ?: W, A( n) Q/ f8 b+ Q1 w
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
3 f8 \/ Q! h+ m, iQuery OK, 3 rows affected mysql> select * from student;, x* M; i' P7 m$ y: p. F: ]8 r
+----+------+
& {# V) Z8 D* I( R| ID | NAME |% H: ?: F4 h* }) w8 A2 ~( g i
+----+------+
9 k. [. Q9 Z: M, k# \| 11 | aa |
9 |4 E7 g# h% A9 c8 ], N- U: D q| 13 | bb |
0 [& @3 m" B4 O| 16 | cc |
; h" |+ L/ L/ x1 ^) E+----+------+3 S3 M% L% X7 r8 X* J8 b/ c* p4 |
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);7 j1 k! s o5 x( h
执行报错:1093 - You can't specify target table 'student' for update in FROM clause& y2 x+ j/ v! ~ B& E6 Q: _
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
( t$ i5 m5 q3 ]) I7 v3 a& b怎么规避这个问题?# i7 b/ q* X4 C9 o9 T2 M4 `4 C
再加一层封装,如下:
5 E% H7 v# J1 B) n8 |$ p# hmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);. V' M4 w+ `- ?- S4 F
Query OK, 3 rows affected mysql> select * from student;
+ m) O! E4 C% q. o$ k9 f9 F+----+------+
: o6 N: b& ]% @0 X6 C$ Z6 n' _| ID | NAME |
8 \' b$ G+ f7 M; P1 I# c0 q+----+------+* d: b1 I$ b) T: w$ [) I5 _
| 11 | aa |
5 E# V8 }9 y' b2 A( }3 ^. l5 q| 13 | bb |6 m) L- s4 ~9 D/ R" F
| 16 | cc |
& X4 s9 X% ]- r+ }3 l% }+----+------+8 x6 e: P s3 d1 v2 A1 D; b/ L* X
3 rows in set / f5 x1 z: l( _4 z) d3 e
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
! F. j8 a/ ?" B8 \9 Z8 Y$ ~3 U+ R/ i& r- U3 B; ]
; b6 b) p5 s$ \
|