|
方法1:
: U' }2 n+ e3 C% {2 E3 ?1、创建一个临时表,选取需要的数据。/ g) e3 U( W P8 T
2、清空原表。0 Y8 U0 U" K: s% {* T: {$ S
3、临时表数据导入到原表。
/ X+ n3 r4 A3 Y) `7 z9 U. a7 H5 J# m4、删除临时表。
* S3 }2 p; v- g2 e( h7 }7 nmysql> select * from student;1 M" B( N7 V/ o7 _
+----+------+
+ j, v. O, Y6 _0 x# f& X5 m) z+ n$ x| ID | NAME |) E& [0 v( }4 U ]/ a
+----+------+, N5 `, i$ h7 ]- G/ A
| 11 | aa |( ]1 A+ e+ ]- ?( X7 J! S
| 12 | aa |
! u7 T- u2 p2 d. }1 Q, S| 13 | bb |( g1 d: s. t* @9 [) z# z3 `. x
| 14 | bb |+ O# x8 {9 ?* [
| 15 | bb |8 }7 n8 `% _2 R6 h
| 16 | cc |
4 S; `( U) }% b+----+------+) M* }- C' u3 s+ r+ _* g" M
6 rows in set mysql> create temporary table temp as select min(id),name from student group by name;; F) r6 ]1 X* F9 I$ ]" W# C# R
Query OK, 3 rows affected/ A* |7 ]) y# U5 p8 W1 H) b
Records: 3 Duplicates: 0 Warnings: 0 mysql> truncate table student;9 K: L$ c4 I# E& C5 O! }2 b
Query OK, 0 rows affected mysql> insert into student select * from temp;5 S. |* |: V$ j7 V! V0 V. j
Query OK, 3 rows affected: A) o- o @7 {1 K" ~4 q
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student;
- o% x- J7 w& K) i4 y+----+------+
- b# o* |+ {# ^6 _) u0 d' |+ V| ID | NAME |1 m; L( H& F# [1 i @4 F
+----+------+( N0 V- ?( V; ^# q
| 11 | aa |3 A+ M: [6 `9 ]$ {# c/ B
| 13 | bb |3 S, }1 D0 U: V$ F$ I$ d4 q) B9 U
| 16 | cc | F' H; S4 N# U- t+ J$ ^- n
+----+------+
7 Z0 `' @, C( v9 q6 n& b3 rows in set mysql> drop temporary table temp;8 @' ?' i! S! M; T
Query OK, 0 rows affected
+ }8 B7 J' j3 I5 l+ q* {- o, U这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
2 h" Q. [3 a1 F, Y# l5 @mysql> create temporary table temp as select min(id) as MINID from student group by name;
+ H0 F7 C5 F# u4 cQuery OK, 3 rows affected( A; \; ]) I, W: r0 B
Records: 3 Duplicates: 0 Warnings: 0 mysql> delete from student where id not in (select minid from temp);
* a9 I P- V# X QQuery OK, 3 rows affected mysql> select * from student;
& G+ E, h* g# s$ O; O( B1 X+----+------+2 P5 ~ }" O1 V7 P. H9 ^9 S
| ID | NAME |# {) x8 }) I/ n* ]2 @6 ~( I. P
+----+------+
" F! I3 g& J: e: x| 11 | aa |& O' v1 ?7 Z9 Q- h; l4 `; n2 ^
| 13 | bb |, L2 b" `0 e8 Q: J
| 16 | cc |9 M' H2 F: O+ \2 B7 h' M W
+----+------+2 }- S1 ]8 N" k- C1 P, D
3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下: mysql> delete from student where id not in (select min(id) from student group by name);# z. e5 C" x) M* N9 z& H
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
7 P7 \" n& m- ?5 D( V B原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。0 ?$ f7 l8 ]5 [0 C- r) v8 K
怎么规避这个问题?: P: w1 s1 b4 E2 A$ l; v8 L7 `& g
再加一层封装,如下:
; d( ^ ~! j* ]mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);, t4 X8 ^, _& }
Query OK, 3 rows affected mysql> select * from student;; y, H7 j9 r7 B; j. }- i3 H! q
+----+------+. Z+ X' J% D4 _7 g
| ID | NAME |6 N' S- s% g8 v. g1 g+ q. l9 I$ s* x
+----+------+, N, W$ y: D1 p: V# u$ e
| 11 | aa |
& o- M# \- u( ^4 Q. r| 13 | bb |+ m2 Z, C! z+ t q* M' u
| 16 | cc |
9 r5 m+ i/ c% H2 _1 `- _ y+----+------+9 x# J& W: Q( {+ l* O* o
3 rows in set ( s7 n$ D( i5 ?5 }' x
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
1 d& V9 n q1 k1 a7 @8 k0 c# R: H9 J5 d) W7 J+ s2 F2 u
% W1 k) Y7 Y# S+ ^! D, |& T! \* a
|