|
方法1:
4 W |, X, J& @# _2 R1、创建一个临时表,选取需要的数据。7 T* g- _- o: E& }+ A
2、清空原表。' U% b6 t, q6 t) |, M
3、临时表数据导入到原表。
: v; n; W( i# Y# A. w: q. \4、删除临时表。
# i$ |! Q8 L) u. J! `mysql> select * from student;
( k: H) Y) ?3 R2 ]3 h+ P+----+------+, S" z+ [9 P0 {6 A* K
| ID | NAME |$ E& {( U5 L6 l, A8 G' D
+----+------+
J9 |5 s' w7 G5 ?0 u| 11 | aa |1 ~" @% X9 z/ F" c7 ?) w7 m
| 12 | aa |/ @2 E4 H, N ~5 E% o, ^$ b. n
| 13 | bb |$ g* F9 [ K/ [9 o6 J* d2 i. \" _
| 14 | bb |- X- {6 N6 a! P+ R# b+ ?4 V
| 15 | bb |
' b5 m+ G; r* d0 x6 U# d| 16 | cc |
% i3 e' [, ]0 A+ X5 c8 c- D% r. s+----+------+
- V j$ Y# t4 }1 ^% l% \* C6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;3 T" [) W+ H0 S" `0 ^, A
Query OK, 3 rows affected
6 |, q4 G1 Z6 H5 j+ o- q9 Y' YRecords: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;. t& O3 S8 [, J3 e
Query OK, 0 rows affected mysql> insert into student select * from temp;+ i% C: |; H1 m
Query OK, 3 rows affected
& N p. o6 A$ i* VRecords: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;& ], l& w$ n8 B$ u, j' P1 G$ e, S
+----+------+9 A& C. Z( Y2 J4 i \
| ID | NAME |
( |$ y' D3 O$ Y$ ?$ ?- i+----+------+
1 \/ Y W7 ^- f0 g# O A: _| 11 | aa |
$ c# U! b+ B2 k8 ]5 V8 S| 13 | bb |1 a! V" E0 R9 ]' I o. B W! Z! O
| 16 | cc |! P+ `) {( p) C( _( b+ l
+----+------+/ K% L& j# O" ]& H( x" H& @
3 rows in set mysql> drop temporary table temp;; B3 S$ F2 J: M1 r! m
Query OK, 0 rows affected% }- \+ B- g1 B) s# X2 x0 ~; x
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
. s6 V& }! Q! gmysql> create temporary table temp as select min(id) as MINID from student group by name;0 h) ^6 X+ ?4 D4 i+ g! \( v2 x
Query OK, 3 rows affected
' W1 I8 o- Z' }9 B% w3 ~Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
/ m6 c3 f: G8 ^4 BQuery OK, 3 rows affected mysql> select * from student;# u6 H0 V5 z+ e8 _0 g7 x/ k# N& D; P0 w
+----+------+* ~9 w; M2 z2 N4 ~! N+ c
| ID | NAME |8 l7 c( I0 H9 f9 V) O$ L
+----+------+
! v7 r6 H) p% F| 11 | aa |: z3 j* h/ J, L, a& Q3 C$ U3 O
| 13 | bb |0 B+ Q; E6 W" b# v. u
| 16 | cc |
e! Q2 _; Y+ V; j, ^7 w- p+----+------+' G' V8 y( K& _7 k
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);9 a$ Y) I l; U9 H8 H
执行报错:1093 - You can't specify target table 'student' for update in FROM clause7 o, s' J, |+ e" q' f2 d
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
# T- o/ l) m' W4 G1 d2 g. @& U- L怎么规避这个问题?* _' \9 n' k! A# j9 c2 Y4 a6 w
再加一层封装,如下:0 n5 |/ o) `5 C& s }+ H: h0 V$ D
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
' z4 m( u6 ?6 jQuery OK, 3 rows affected mysql> select * from student;
- D H k5 s5 N/ E: U. K% S+----+------+
& T* L9 o- ^8 l6 x* v| ID | NAME |
9 h2 X0 L3 i6 X+----+------+0 f6 m- y: I j0 l' X, A5 L
| 11 | aa |! k# S* i- N5 R8 i# f3 G
| 13 | bb |
7 f: `7 X) t3 q7 F; \| 16 | cc |
2 d; X# U6 r) K1 w, S4 J# \+ o+----+------+1 }2 D6 _( k$ v# C# F# M
3 rows in set - q7 T. J3 b# ~+ K
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
9 p8 }: P0 }) T) y0 S2 Z3 h
; o1 w% D6 ~( n D9 _+ D' c7 b' _, q7 e1 u
|