|
方法1:! K( ~8 f9 [8 b
1、创建一个临时表,选取需要的数据。
: v5 o' l$ J5 P; ]- y! i: F3 v2、清空原表。
* ]* ?) \; M$ w1 M6 c3 [. l3、临时表数据导入到原表。& H" |% R! H/ G) U3 v
4、删除临时表。$ x+ R, S; E" w+ {' I& U
mysql> select * from student;% l Q( W7 T" t! }7 j5 i: ?7 N/ t
+----+------+8 U' v% w3 E, W# L
| ID | NAME |# K; v5 K6 _+ K2 k1 f) F
+----+------+ o3 {. `: J5 I$ H
| 11 | aa |9 @% R# T* G) S$ V; i1 ]: d
| 12 | aa |
3 Y. O7 v# O( P| 13 | bb |+ D5 Y6 s& g0 z
| 14 | bb |
6 ]! g- j- i$ }4 K8 P| 15 | bb |
; ]9 Y% ?( r; E. X6 u9 g| 16 | cc |+ A S5 @& c0 {7 T
+----+------+6 }1 h O5 N4 a$ \, Z9 Q! a5 e
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;
{0 N. p4 F! z D; q. u! N( {Query OK, 3 rows affected: O. }, T/ {4 T' g
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;
! \, K G- F. k @3 Q; Y$ DQuery OK, 0 rows affected mysql> insert into student select * from temp;3 c& P4 m9 x& L+ t9 u E
Query OK, 3 rows affected4 }' w7 K; O! b" Z) |3 }6 z3 w
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
$ }$ R& s8 X2 u+ {1 R5 z1 R+----+------+
0 a3 V# D) M T! Q% u| ID | NAME |: m$ r& _ ^/ W. L3 u
+----+------+
. e6 k s* s% c5 d5 s, W$ I8 w| 11 | aa |: o' O/ l$ a* c/ o& r* C
| 13 | bb |
; w7 E# K3 n1 C$ `! t" }# _; A, B| 16 | cc |- S B5 t( x0 Y [: g* ]7 f4 S1 Z
+----+------+' F( y! q8 z- C( I
3 rows in set mysql> drop temporary table temp;( X/ T4 J- h$ Q+ h8 z
Query OK, 0 rows affected+ o# W" f8 y3 y
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
. e4 `$ A8 b9 |" B( Imysql> create temporary table temp as select min(id) as MINID from student group by name;3 n9 ]; g! `; Y+ [, Z5 r& ^
Query OK, 3 rows affected
9 F5 o9 j, s' ^, T: F" ^7 d9 }Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);( k% T+ G. c' d! T Y7 j
Query OK, 3 rows affected mysql> select * from student;
, z/ H4 O9 C' z7 q% A1 l+----+------+
7 u! u8 m/ W3 F$ V, q8 v( \| ID | NAME |
$ j. a% @) z; r5 n4 o+----+------+8 b2 n5 I; O1 g' a+ I
| 11 | aa |$ p g* g! ]6 z( O. H
| 13 | bb |3 p& N( u" w' \) H/ O! Y
| 16 | cc |2 W) ?3 ?% {5 F
+----+------+3 J3 @* R9 O7 g+ v/ c4 V- b
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);
( N$ E& n; W5 M7 n& X1 v/ C5 f执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& e2 B3 q* y% a. o* v原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。8 T5 h! B2 r6 g2 {! }# T1 \' r V
怎么规避这个问题?
( u/ G! Q2 D6 p/ s4 _" p3 i再加一层封装,如下:8 `2 K, L. J+ p
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);+ S# ?% s5 t0 q7 c& ~" }4 Y% q4 Y6 Z
Query OK, 3 rows affected mysql> select * from student;7 _2 ]# N: I; h
+----+------+2 H# g' U4 G; \$ f/ g" L
| ID | NAME |, m6 z- B7 O" e; q
+----+------++ \, |) d7 [: l3 j
| 11 | aa |8 ]3 R. Q" A+ [$ A" ^! Y2 v
| 13 | bb |
1 O0 L5 R4 p9 m' B( @4 Z. z| 16 | cc |
' }8 v4 B- L; N% @% O- F+----+------+
7 P2 F" E) C; A7 N5 K9 S3 rows in set
, K1 n* P4 W8 X& l3 J方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
, `4 d6 Q7 q, Y+ S& q; Q3 m% Y! D! `/ @2 Y5 q5 ?
( d5 ?$ ~) k- v8 ~6 H, r) o: p |