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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:. Z7 c" d4 O' T# u7 z0 n
1、创建一个临时表,选取需要的数据。. N- m/ D% M7 a) e) D
2、清空原表。: [) U! P& {. t
3、临时表数据导入到原表。
, {  _# I3 b) S0 ~4、删除临时表。2 Z6 r  |3 N9 r" r
mysql> select * from student;, }# A) t! i3 z" V" z
+----+------+
, o3 C6 F: T) J| ID | NAME |
* [7 F' P; t6 n+ T) I, I& @2 ~+----+------+) O0 U; m/ n9 ?) c1 r
| 11 | aa |
; x6 [0 g# _9 K  V/ f; p2 H| 12 | aa |
- y8 N* N! L2 j1 M# }. f/ x| 13 | bb |
; S8 m; x% r$ l2 v0 j4 }| 14 | bb |5 e5 c2 W2 _% P4 R4 m
| 15 | bb |' ?  f- w& S9 f4 n2 U' A# n/ n
| 16 | cc |
. J' }6 i$ f. K- M9 [. P" {- x+----+------+2 W/ p$ G  {  Y& L  I
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;9 j! N4 L* x1 ~. F8 f& R
Query OK, 3 rows affected1 T( N7 P6 I6 X  r
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;; ~* X! d" o% O# ^3 p4 n
Query OK, 0 rows affected
mysql> insert into student select * from temp;3 H( C+ G+ U& n! V
Query OK, 3 rows affected4 ?3 `# V# |  ^; S! J
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
! F! x7 E3 k9 U+----+------+8 w( l" i: R% K. P- B
| ID | NAME |
5 X9 e9 E4 H4 h1 t+----+------+& |5 g5 \1 H7 L6 s; `+ C$ T' ^
| 11 | aa |; A8 w* J6 N9 Q0 @8 e' m
| 13 | bb |" W; x! j; Z% m& J  Y& _5 r
| 16 | cc |
! F4 U1 F( Y- g% g7 L+----+------+8 }# f" T" i- t/ {  {: P' G1 L
3 rows in set
mysql> drop temporary table temp;) _1 k6 x+ A0 R1 [+ I/ a
Query OK, 0 rows affected$ x% a" e9 c& q; R/ r! K) |6 X
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
1 e: z# ]4 \+ D9 Y3 ~* ]" C3 W+ D2 Bmysql> create temporary table temp as select min(id) as MINID from student group by name;
: X: @" Z6 }. C: aQuery OK, 3 rows affected" J! X: b; b- c, S
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
- j9 E2 r6 h5 GQuery OK, 3 rows affected
mysql> select * from student;
0 H* ^! A0 V7 k5 Z+----+------+) ]) i( F- b  [$ X
| ID | NAME |
5 }% W$ X! e. }6 Q4 Y. F) Y5 J+----+------++ n. \  ^- l8 W
| 11 | aa |4 }( ^7 `' M- k
| 13 | bb |( o, T0 s7 H  Q) s, T* O) c
| 16 | cc |" m$ A9 @* `5 k' w" E
+----+------+
5 x- B1 M: J8 k7 C  c3 v6 Z3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);& P  @+ v- D& }! ^/ C, W( ^( ~' C
执行报错:1093 - You can't specify target table 'student' for update in FROM clause8 g& T4 C* Q$ _/ [" e8 Q, ~* i
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。) i) R/ n( Z! X5 a% R% I9 w
怎么规避这个问题?* e" ], y" m8 S- i! t
再加一层封装,如下:4 J$ D" c$ X5 w2 I* ?4 w
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);  V+ g. q: a  a+ \5 \" Q3 R
Query OK, 3 rows affected
mysql> select * from student;6 p* U: s* ^/ I. I
+----+------+& g! ?& j+ b5 E% r& H
| ID | NAME |
' D6 O: {, y! f3 l( m7 g( e8 a( o+----+------+$ x- \: ^6 c* {3 q' e
| 11 | aa |+ f- |& M: m! ~0 U  e% _: D
| 13 | bb |
3 `" V. n* h6 R1 q| 16 | cc |( |" c* N1 t2 Z* c3 G; T
+----+------+% L6 n; W; Y0 M
3 rows in set
% l. q2 h4 |: [9 m
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
) W: n* o$ q- L& }8 i: V
% h: G0 C: c+ a; V0 w& B# r, w
0 f$ Y7 ~% \8 H; z4 Q& ~: }. Z
回复

使用道具 举报

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

本版积分规则

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