找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2207|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
, Y0 _. O4 s5 l' \, E1、创建一个临时表,选取需要的数据。# w5 [- U3 [3 a, N
2、清空原表。
; o" F$ @+ f1 s$ b# b, N3、临时表数据导入到原表。; m! I7 K( I& e' L, R
4、删除临时表。
$ O1 c3 E/ S- Y( j/ h" Imysql> select * from student;) \# O) c. y. s) @
+----+------+
- i: W! e- b6 K| ID | NAME |. F3 \2 e/ n5 _
+----+------+0 m) K2 ]. W! J) l+ F9 b7 R' F
| 11 | aa |
5 \* u, ^. d  U+ b9 D9 T  h4 u( G1 Y| 12 | aa |
$ l3 L$ b/ _6 F# d7 X  k: ~3 k- u| 13 | bb |
/ R- n( ~7 f$ p" u7 o0 b+ O| 14 | bb |& w* s0 i+ {- u
| 15 | bb |
$ F' I, H. q7 z) a" H3 j6 O% S| 16 | cc |
" `) A4 l$ d! s* _+----+------++ J' u0 J9 A2 f% F7 ]3 X! L
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
2 ^+ |' d) v9 [  Z7 TQuery OK, 3 rows affected4 ~# S0 B" I: ~6 c# }& T5 ?8 x- Y
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
1 U6 C. L# S0 H( ZQuery OK, 0 rows affected
mysql> insert into student select * from temp;3 N! c& Q9 Z5 E9 @1 ^- ?( L
Query OK, 3 rows affected
* [% o9 K" a. X; A# ]( c  E+ R) jRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
2 \6 U$ D9 K( f+----+------+
' [( P1 ?, l% {" I) c9 \| ID | NAME |
% {% o0 ]. _7 W/ E* Y% N. @+----+------+2 |7 L4 a9 g$ B' H: ^, Y! z0 _  ]* `
| 11 | aa |( p" R5 o% H& c) s1 t
| 13 | bb |
- j7 c$ w- \! L+ `  p4 o+ C0 P* O| 16 | cc |
6 E5 J- u: k2 c  p# z5 p+ v& u2 o, b+----+------+4 u& x9 b1 s" t3 [# r. B
3 rows in set
mysql> drop temporary table temp;- q9 R4 P: ~6 }
Query OK, 0 rows affected
  e* D" B% M' |. ~3 C4 W6 U- l7 c这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:% d6 c8 q5 u! v6 \( V' h9 x* g" ?
mysql> create temporary table temp as select min(id) as MINID from student group by name;
5 b" ~. L5 d2 Q9 K# e" qQuery OK, 3 rows affected( f# e+ |* I3 b* t) d
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
# e* y8 e8 G8 P5 {Query OK, 3 rows affected
mysql> select * from student;
- m9 p- W3 [* |! t8 H: @; V* b+----+------+
7 \+ r2 O$ g3 || ID | NAME |
% [1 x' C- d: w* w' w8 H+----+------+
; z, Y1 a- t% @| 11 | aa |" G% H; f. O9 e8 ^* p% s
| 13 | bb |2 G, o1 E' Q# L
| 16 | cc |& H" J# |0 T3 V( b; k
+----+------+
* P* u1 V, }: b) _5 i- c3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
3 c9 l7 b( [; m/ Q) s8 d/ o执行报错:1093 - You can't specify target table 'student' for update in FROM clause$ G* Z1 [  G0 F2 c
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。" q% i( o& w- |1 E: C& H! s6 r
怎么规避这个问题?
, c. j8 y! w8 m5 o再加一层封装,如下:
2 H7 Q; N6 f" P6 m( pmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
" U/ @- A; o2 y* Q8 q) EQuery OK, 3 rows affected
mysql> select * from student;' ], C  K6 p  X' y. }' q
+----+------+( }8 B9 w  O3 _, J$ q
| ID | NAME |( o, Y$ B1 E, O" e
+----+------+: g1 S3 j" b4 s4 Q5 R4 D1 X0 U
| 11 | aa |
' ~- G/ g+ c0 ?! M& ^8 |0 l/ d| 13 | bb |: J6 I) K/ x+ C' }7 F* C
| 16 | cc |8 N* [. M. q9 i( q3 A, R
+----+------+
/ k  R( g. `2 p  V3 rows in set
4 t0 s9 g. Y. _# z
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
# `9 z. K/ K4 c! X0 ?& b- H" s0 |! ?" M* N* l* l

+ f# h( A2 K5 ^: w# L
回复

使用道具 举报

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

本版积分规则

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