找回密码
 立即注册
查看: 3207|回复: 0
打印 上一主题 下一主题

mysql删除重复记录,保存Id最小的一条

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
: e2 Q# C4 D/ q1、创建一个临时表,选取需要的数据。
: }  a9 d1 T3 h5 U  M2、清空原表。/ Q8 r4 M) |' S! w. A+ h2 m' B
3、临时表数据导入到原表。! C; z+ Q& J$ C- A( v1 K
4、删除临时表。, ?; M8 @( o3 b4 g3 o3 _1 x  p. G
mysql> select * from student;
# n6 O8 |4 I$ a( Y: R+----+------+6 l6 {9 J. m" r
| ID | NAME |
0 ~+ Q2 F" N; c" f. p+ J$ v+----+------+( ~$ T/ N% e0 W! i6 |
| 11 | aa |# E/ S# F% \* I! C2 t
| 12 | aa |* V4 T9 n- B2 `/ h' N3 H2 u8 r
| 13 | bb |
2 {/ X2 @8 h  h% m- e| 14 | bb |
' w/ h7 ?+ u  |' U/ s| 15 | bb |
- t; u0 J3 E9 J2 i| 16 | cc |: c4 Y6 _. A1 N7 E3 e7 |
+----+------+
  K& `8 O9 r7 |: B( x6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
6 |+ ?4 |6 H2 ]( N! rQuery OK, 3 rows affected
" @1 G; ~7 z* E9 Z0 ]Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
, j+ M- O  J. I' W( zQuery OK, 0 rows affected
mysql> insert into student select * from temp;- p2 k: q6 }9 Q2 W
Query OK, 3 rows affected
: ?* I$ U1 R: j/ C0 E9 gRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
& b2 J# t7 s; T# t7 F# X4 F6 m: A+----+------+
. N2 {" M  _) k* y  X8 _: @) i8 F| ID | NAME |
& O6 e5 l/ \6 L( E% U+----+------+
2 a% f! S8 m# x- i| 11 | aa |
& C2 P3 |4 ~+ m9 b8 R- n| 13 | bb |" j: x: w$ `( N. Q/ s, x2 n
| 16 | cc |
7 I& v0 S+ o! {0 v' S+----+------+
1 ?" q) m! v' a5 r, z% b, E3 rows in set
mysql> drop temporary table temp;5 c' L% h8 z5 f( K, |% y0 |
Query OK, 0 rows affected
" N: R/ f9 b4 d# ^' `6 {* J  o, r/ O/ z这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
3 B9 u( e) v0 U6 Tmysql> create temporary table temp as select min(id) as MINID from student group by name;$ J4 _5 K7 }& m: k
Query OK, 3 rows affected
2 P( k. F4 `- b! kRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
* J/ Y& N9 m1 m2 I0 QQuery OK, 3 rows affected
mysql> select * from student;
+ w9 c% W# k4 x* d8 o. D. P+----+------+
) c5 ^3 S1 k; J/ O9 v; Q$ Z| ID | NAME |5 e. n" D% X' ?
+----+------+4 w0 j; Z6 x- R
| 11 | aa |5 k% g! f6 ~6 k% z" O
| 13 | bb |
; u& l2 k6 y+ C. ^| 16 | cc |
1 ^: k8 l" ?4 a( c0 L$ F+ h" v* M: F+----+------+
2 e" s; C( p  L$ J% J6 T' E/ p3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);% l$ x1 j/ P) @& w
执行报错:1093 - You can't specify target table 'student' for update in FROM clause3 a) ?2 o7 G7 ]5 W! w
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 b, Q8 _4 F5 n  ^( r怎么规避这个问题?1 W) S. O0 W" n# l- i5 \; y# L
再加一层封装,如下:: I. _- ^7 m& O8 G, w# U
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);: _) x% b' |$ S0 X
Query OK, 3 rows affected
mysql> select * from student;# q" [, ]+ D! u( |
+----+------+
7 S; O; M9 D* p) ]& i| ID | NAME |
' c7 O5 v, h( W0 b9 a+----+------+9 |9 Y1 ~& u/ G
| 11 | aa |. l* _1 l0 j+ v, |* r$ ~
| 13 | bb |
: }) w+ w) F& H4 z# v: [| 16 | cc |* ~* `" N5 Z+ p; E5 z& ]( u
+----+------+! S  t# U! u7 F3 M
3 rows in set

7 V+ R3 K2 @3 `5 U& g9 H方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
7 a  p( ?. \5 f
2 v+ j5 v8 t. w: R0 Q, t, d
) B- J' k9 H6 M# u5 I7 [
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表