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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
- T. L9 r3 I' C9 [3 s& W1、创建一个临时表,选取需要的数据。
) m4 \8 n7 Y3 Y3 k' X2、清空原表。5 k: _& T* e. L# ]$ [: V! i3 \
3、临时表数据导入到原表。
' v. t$ S3 n  a2 f8 y* m& c- Z5 Q4、删除临时表。2 F7 ]5 @5 ]# h. l$ n, ?
mysql> select * from student;* ]' k/ z: z5 l% i
+----+------+' D7 c% \; C5 G6 K' ?. d
| ID | NAME |
/ ]& f2 ~9 r8 [" z8 y+----+------+) c6 m" o' _; ?
| 11 | aa |
1 j& z! k" [: M| 12 | aa |( k$ w3 F2 V+ L2 r0 |6 }
| 13 | bb |
" g2 |) ~9 ?) U% e* x) V! F/ A6 L| 14 | bb |
5 w' K, y) S) o) B& v| 15 | bb |5 N; e; i% S" r. {4 O, ?$ Y7 C
| 16 | cc |
+ [0 Y0 C/ `- m7 U! W' a  |' y+----+------+6 |* W6 Q$ a/ V0 f1 P/ p! E
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;8 G, Q; w/ M, b. |
Query OK, 3 rows affected5 g5 }6 T$ x; D
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;9 r9 h$ T9 J4 r; @# C0 s
Query OK, 0 rows affected
mysql> insert into student select * from temp;
2 H; r) V( w' T3 H/ ?Query OK, 3 rows affected2 ~& b9 ^! s: |* x  I, d2 o, w
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
6 q: ^+ y: u! V7 O! }6 K+----+------+% _) J; _/ U5 c# u9 u6 j
| ID | NAME |  x0 d6 f. P+ T) h
+----+------+
' Z2 s- t0 C6 C* p# ?5 a, X9 c6 a2 m| 11 | aa |& B# G  r, D/ t# T; g2 f
| 13 | bb |
8 y, d* l! T. s8 D0 q6 x  L& Y) {5 y| 16 | cc |: U- ?" `* V  M" w. |* P
+----+------+: r$ }# h0 P. r! L! V0 p
3 rows in set
mysql> drop temporary table temp;
* e' @# w  C' I5 V- ^! H- H% L; hQuery OK, 0 rows affected0 c2 T' K9 p+ t% V
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
1 ]) l, Y0 q- H* T( V! U$ U: cmysql> create temporary table temp as select min(id) as MINID from student group by name;' E9 _& ]6 j5 i
Query OK, 3 rows affected' P* J* K* Y5 l) y# d8 |1 w) c
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
! I3 a6 v! {6 n( `5 NQuery OK, 3 rows affected
mysql> select * from student;
% c( O/ o: a8 ~2 o  L+----+------+
: T3 r$ C4 l/ S| ID | NAME |" c1 V- R$ O  g+ i& r& V
+----+------+! g7 Y- V, T% B% z8 D) |: y
| 11 | aa |4 T" y9 |* B+ Q+ z1 x, D/ i
| 13 | bb |
/ l# x" \; T+ y3 P| 16 | cc |
: L: M. {& [3 f7 j+----+------+
! [8 O. |# A" z: W' y3 j7 w" b; a( m  e3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);$ B) ^' R, Y8 T/ B: P# M$ j' E
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
+ {6 }6 y1 v2 G原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
0 a0 W+ r! Y  A/ C怎么规避这个问题?" ~. Z  H& `# \# y
再加一层封装,如下:8 l5 C; D6 z; z# S& }" a1 W  _4 o8 j
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
  j' u' X( L6 f% @Query OK, 3 rows affected
mysql> select * from student;+ A  @# g; i* _0 X: x+ p9 o! W
+----+------+
/ O+ j; k* Q$ P: Q) }| ID | NAME |) o9 N0 G- m+ t
+----+------+
5 m/ h7 X4 T# ], c| 11 | aa |+ B8 [* n6 f7 u# L+ N
| 13 | bb |; O' m3 |$ h9 i# n. l
| 16 | cc |
' q" I5 o9 q# h8 \* r& t2 C+----+------+3 \5 X1 T5 X: |5 |4 e( u: x( q
3 rows in set
& O/ B2 \! C' g3 P
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
! n* O+ C! M* L- W& W  E! C. Q$ u- N( j4 k- l4 [
+ |% G/ ?9 P  Z: d( \, r6 O, Z
回复

使用道具 举报

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

本版积分规则

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