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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:" L1 j( O& q1 q1 Z% j
1、创建一个临时表,选取需要的数据。8 Q, P( Z# m! I: j, k
2、清空原表。8 n3 j, W$ J, g6 H
3、临时表数据导入到原表。$ D6 F4 @: A4 \6 y% `4 O' p
4、删除临时表。4 F$ j% b6 x) [$ w- j! \
mysql> select * from student;
! o4 z& j5 A/ q+----+------+
% w/ D: O% A' ]" K/ V| ID | NAME |
2 W9 z* G. j' T( p! H) X3 t: t+----+------+
, i, x$ P7 o  `1 k4 p| 11 | aa |% C8 V( r3 f; H6 ^# \, i5 x0 F3 o/ E
| 12 | aa |! H$ }# @" x" J' {" ]  [) U
| 13 | bb |
. j6 o8 h5 d6 Q. o| 14 | bb |
. R8 y5 t) w" Z+ x8 D| 15 | bb |
1 l( y5 V! M; R! e7 R| 16 | cc |
" Z5 [) F& B; W/ k% G: H5 f  e+----+------+
" s/ R( M( [) F2 e6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;' n- ]" f  E9 ]0 @1 Q
Query OK, 3 rows affected
& a% r1 Q; D3 U8 ~Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;/ J: `$ ^$ I# }* I$ E2 S- \
Query OK, 0 rows affected
mysql> insert into student select * from temp;# Y3 {$ X5 A3 b5 v
Query OK, 3 rows affected
5 [  L& O( h3 G* yRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;& u: F9 i: Q% D( `( a
+----+------++ W8 u1 @/ c" p
| ID | NAME |1 @/ J0 W' J9 h. W- a5 J
+----+------+
# g& G& l# p& N- j& P| 11 | aa |
* p, H/ U8 T* E  Z5 ~- ?& p: m. O| 13 | bb |1 R$ {# v4 j/ X% r. [+ Q
| 16 | cc |
% X0 }6 U% ^' G0 W# Y* |3 }" @+----+------+
1 [: x+ @$ j4 r3 rows in set
mysql> drop temporary table temp;
6 N! Z9 u& k+ Y: w. m- QQuery OK, 0 rows affected* G4 S! L8 z9 u6 q  |: e  U2 x
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
8 c& e+ O2 G) Cmysql> create temporary table temp as select min(id) as MINID from student group by name;
/ x; |( l' k- r0 j" a4 q% NQuery OK, 3 rows affected
. C3 K* R( v) ~" E4 b% t6 VRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);" p. Z7 f7 l. K2 n
Query OK, 3 rows affected
mysql> select * from student;
3 {/ n( Z: V4 b- W+----+------+
# |5 a: }  P. f( I| ID | NAME |& Y9 @; |- R; K: M/ V
+----+------+4 R) H1 `7 G$ D2 n- M: W  q
| 11 | aa |' m; O' ^% A9 l$ O' x) z
| 13 | bb |+ K0 Z. K- i/ G' @0 {, D
| 16 | cc |/ O( z5 T2 C! d
+----+------+
: Z" R8 ]& @" S( ]* m( D4 [1 m3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);, n8 K3 D8 ]' h/ {/ ~6 @
执行报错:1093 - You can't specify target table 'student' for update in FROM clause0 Q" _( X  ~) l6 @& f7 o6 @0 Y
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
5 N6 [* ?2 Y  r4 x  _8 _* x  D怎么规避这个问题?
6 n  s1 x# [6 x) i+ g5 m9 ]( g再加一层封装,如下:) U! H$ K6 D- u8 r
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
' c% N# ~: m7 `" R+ A* r  }  aQuery OK, 3 rows affected
mysql> select * from student;. c7 L1 F% ]% ^! r8 [
+----+------+
) H3 F( X$ B, I$ M. J. Z| ID | NAME |/ N, g) b0 W% y' f. z
+----+------+
' A% M& t4 \/ |' ~7 z| 11 | aa |+ p) ]& x* s9 O  m
| 13 | bb |
' o3 h5 L5 S$ c6 G* l0 V| 16 | cc |
( {# x, f  Z6 Y7 o' }3 s+----+------+
. |4 u) d1 y. G7 ]7 }3 rows in set
* i: g" K. A; b/ u
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);: L# D# \3 P2 R( H! j
) H: M# ^: q" h# F" b6 O

5 u$ l1 y5 T) y) W5 U4 {, B% `: T1 o( h
回复

使用道具 举报

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

本版积分规则

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