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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:  Q3 N( F9 O# R0 m, b- R
1、创建一个临时表,选取需要的数据。5 g8 @/ Q* W  I( r" f; P. u8 p: x
2、清空原表。% A" y% W) p  B; j' k
3、临时表数据导入到原表。
+ {- ?$ \" v7 M5 O0 Q' ~+ u" e- U, r4、删除临时表。
- Z0 x5 x, G, c6 emysql> select * from student;; W. {! G% c) E8 l- }" I/ ]
+----+------+
' u1 O, k6 R. U4 Y2 Q) a  c$ f| ID | NAME |, H3 R5 i, u& G3 v
+----+------+- d; y# v) _! ?
| 11 | aa |3 [( @6 \4 a& e6 K% \* D
| 12 | aa |2 K, i' G. u9 U5 I1 M: v
| 13 | bb |
; v* p2 w8 m% f| 14 | bb |# B4 H. \, o1 Z0 l
| 15 | bb |
( c& |) w8 G4 ~& u4 `| 16 | cc |
& G  o9 S' F" n8 p- @3 e$ O4 f8 b0 b+----+------+
- T$ b* `% j% `, v6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;/ q6 k5 ]: Z- H" e6 ]1 v
Query OK, 3 rows affected
8 w9 {! L" f$ r1 P: C2 y) m" fRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;' T8 j" b# G8 Y5 J' C) m$ P
Query OK, 0 rows affected
mysql> insert into student select * from temp;
( P- z- g5 s! b6 ?; g. B* V6 nQuery OK, 3 rows affected
# Z' n6 }0 C/ Y+ }Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;& X& {% T8 i8 @( G- \
+----+------+9 |- d4 ?/ Q3 b; N& X& c( Y' ^, t) Q  n
| ID | NAME |
) t) p' B% o5 e& t( [) N+----+------+
8 a4 U6 Z/ J& n) j0 b| 11 | aa |
$ o( }: B+ C" O" q| 13 | bb |
' B$ _6 A3 c0 \8 J* Q* W7 Z) L| 16 | cc |! o1 z1 x8 `8 ]2 {! ~$ l: y
+----+------+
: X0 x! T; c9 n3 rows in set
mysql> drop temporary table temp;2 Y) Q9 A0 T% {' D7 }9 t
Query OK, 0 rows affected9 h( o4 A2 R3 F: q! X$ g" H  z
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:  X$ Y2 ]( q* d/ c3 D2 o
mysql> create temporary table temp as select min(id) as MINID from student group by name;( T7 V0 M& j6 Q0 W7 _/ Z
Query OK, 3 rows affected
9 M) t6 k! N' {' C  o. ERecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
+ b2 S6 l. }  PQuery OK, 3 rows affected
mysql> select * from student;
" ^3 h$ e4 r7 L" W% f* X  {+----+------+" c' Q; ]1 g; j
| ID | NAME |) U6 J" B. f- P3 j* q
+----+------+0 {1 n$ x# f. D) L; K$ a. \- q
| 11 | aa |
0 i! S" A; \5 H. O* y| 13 | bb |
; M1 Y5 Q! \& ^  t. u! O! g  _& m| 16 | cc |  V6 d% N% r' [( _4 h% q
+----+------+
8 M6 ]0 u; ^$ T8 d' h$ m3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
3 V9 ~. k& @' V5 o% e1 e0 u: j  c5 y执行报错:1093 - You can't specify target table 'student' for update in FROM clause
, M9 H' g( r6 ^9 `$ ]原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。3 H" N7 x! a9 w2 J
怎么规避这个问题?
  h, {0 n! f1 R& @/ ]6 C9 j8 v5 Q* u再加一层封装,如下:' l$ e. G1 J0 M7 a" R1 j8 j# q+ d2 \
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);- v, H+ ?0 ^3 N* t0 `; g" E! h
Query OK, 3 rows affected
mysql> select * from student;
& a8 {4 M) f. y; N: o+----+------+1 ^# L# u5 M; Y
| ID | NAME |
9 ?! ^, o  [8 b6 m+----+------+5 w" V( l" `! R+ a2 e& Q" i6 T8 K6 [+ f
| 11 | aa |
/ _- l) I7 l5 q/ E| 13 | bb |; J7 e( V+ D6 e5 q. l
| 16 | cc |9 O9 ]2 Z5 ^  G' S* r/ D6 K/ v
+----+------+
) J1 s1 A  J, m3 y3 rows in set

- V- @8 X- o+ L6 d- i方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
/ X. f% \' p0 s1 `/ l8 R- C9 @( s' q* {

; ~  }4 e9 t+ e( ^9 H# u
回复

使用道具 举报

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

本版积分规则

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