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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:! C  u, z+ W2 Y! @; z
1、创建一个临时表,选取需要的数据。
; d, i. w; _; N' y5 k8 N( b2、清空原表。, K7 d0 V4 J  l+ Z4 ^* j4 |9 O+ _; e( c
3、临时表数据导入到原表。' I9 i4 q9 q0 T( m# D( G
4、删除临时表。
6 M, w5 ~/ }- k$ Q" q7 L7 R, Hmysql> select * from student;
8 R" |- c" q% c! R8 R8 i  S+----+------+8 H& f- x/ K& J0 ^% o
| ID | NAME |
& c2 G) |2 Y" V7 N+----+------+- I+ L  W6 r" G3 @
| 11 | aa |
& X: q+ ~* _' A; e. n| 12 | aa |' f. n$ A+ H. l* Q
| 13 | bb |
1 A% g. {: F& l" r5 \; r8 O| 14 | bb |
+ m4 `* x( y& x3 k9 h1 r| 15 | bb |
1 X8 d4 Z: M( O. q| 16 | cc |
( E- I6 q4 \6 W$ Y( W7 o( Q+----+------+8 \8 [0 p: F' _* g
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;5 S+ h: t2 k) g1 r& u; M2 @* z% M
Query OK, 3 rows affected) ^" f& V) _/ }8 ]# u
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;2 H$ X7 ?9 b0 `0 v3 U0 U: v
Query OK, 0 rows affected
mysql> insert into student select * from temp;
5 y) ^4 }  S0 ?3 C1 sQuery OK, 3 rows affected
2 ~- O, k! w; Z& J# }# iRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;7 T" x# N* y- W, d, _6 i
+----+------+( v7 o% F" s% P8 y
| ID | NAME |7 |8 B: |3 m! a/ b# ?, @; G; D; K$ n
+----+------+9 g5 |: J* E: S
| 11 | aa |
7 v' R6 E7 J6 a* ~/ P. b; j% K| 13 | bb |+ @/ S& h  s2 w4 K0 Y/ b- j( s
| 16 | cc |
/ A) D6 }; O& ^0 ]. i+----+------+# h) L# y! v* l( V5 F( w6 w
3 rows in set
mysql> drop temporary table temp;
0 @/ d9 y' h  z' j) Y( `2 W1 P! KQuery OK, 0 rows affected3 P( U/ {$ w3 Y/ O' U# D. Q
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:' Q; A2 w9 D) a6 o* ]! |3 F
mysql> create temporary table temp as select min(id) as MINID from student group by name;2 n. v6 R( K# v, l1 T4 M! P  p
Query OK, 3 rows affected# W, u" S3 k0 Z+ A( ?
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
: A0 ?+ k" k* }Query OK, 3 rows affected
mysql> select * from student;
6 F  I4 d4 _( K+----+------+
8 `' _/ o+ V" A: Q| ID | NAME |* e# I( ^5 x: L8 k/ z# @2 j
+----+------+
# J/ P, ?& }4 L1 w& k| 11 | aa |
. a6 y' I5 N$ L! {+ a| 13 | bb |  f/ s: g( A% j; ^1 s# {
| 16 | cc |+ F. N, }! B. f; S9 ~3 G, `8 t
+----+------+' l$ p, J+ A0 @/ U4 u3 f) Z
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);+ z4 G" Y6 \$ f: g( ?" N
执行报错:1093 - You can't specify target table 'student' for update in FROM clause% ]+ V$ Z# `0 f
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
# X: O" C! }8 q8 f2 H: `9 l- }" A8 H4 M怎么规避这个问题?
8 e4 ]) f0 ~: ?" Z" q再加一层封装,如下:
1 F& Q8 q+ v' |( `$ K7 Jmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);* a, c" \- z: A4 u
Query OK, 3 rows affected
mysql> select * from student;- Z1 w( P7 e" _
+----+------+
' O( b' ?7 f! x| ID | NAME |9 h: q& ?" ^+ b$ c0 U' f2 N0 x; t
+----+------+6 f  ~+ \* q. }
| 11 | aa |
1 _: |" T# A' T| 13 | bb |
) O4 U) ^! [0 S! n$ J- W| 16 | cc |0 Y  E0 N( x6 Z6 P# Y4 F
+----+------+
; f' h. B( |5 ]8 _9 R+ I# {3 rows in set
! V  n' h7 r1 e; W9 a$ T2 D
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
8 ^- J5 @( \; ^) F
2 U2 y- `8 I1 f" D$ f  X: c9 ?- F8 w( d$ T
回复

使用道具 举报

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

本版积分规则

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