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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
1 ~5 E! s; }( @% N1、创建一个临时表,选取需要的数据。
4 u7 Z" _7 _0 \0 a. b4 ~6 t2、清空原表。* l; n. \9 W) P' @$ s
3、临时表数据导入到原表。& T: y8 q# y/ Z( P1 d
4、删除临时表。
1 L  ~/ j) t( rmysql> select * from student;
: f) }2 Y+ s0 m% f- K+----+------+
5 ?; Q4 V& X3 _* D| ID | NAME |( p3 z8 D" T- W6 [
+----+------+
; l( f7 T& H7 b/ d$ E| 11 | aa |
7 s; u  c6 _. |! B3 f4 h* }2 b| 12 | aa |
% p2 @1 F7 @; o  j0 q| 13 | bb |- I: z# ?: [, O; e9 X# w5 k" [
| 14 | bb |5 @1 o2 g% j* h: n! s1 V; D
| 15 | bb |
# Q1 {  l' W! ~( N$ Z/ G' _7 I| 16 | cc |( s  R& {* X- W. e
+----+------+  P7 m6 S8 {# j0 `
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
$ x* w2 n: @2 t+ m$ I' TQuery OK, 3 rows affected; r' r3 E* F$ }5 s, l4 K
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;6 S/ @# c4 Y& m7 ?: N* Z
Query OK, 0 rows affected
mysql> insert into student select * from temp;
9 x3 w3 U' F' ^2 D# rQuery OK, 3 rows affected
& a0 r0 i: w0 Y; a  PRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;  Q" y, E( E- S0 Y+ P2 ~
+----+------+
& H# K* ]/ ~1 Q; G7 N; f. k| ID | NAME |
; S0 W& i+ u4 v" V) y# b% N+----+------+- J5 F6 c, [; B2 Y4 D3 [
| 11 | aa |9 d, a- m) c$ T! D
| 13 | bb |$ \+ J% A8 c) C% p9 }$ F
| 16 | cc |8 p) f! D9 |- L/ U
+----+------+
4 C4 ?( H* M# S& y' M6 y5 q3 rows in set
mysql> drop temporary table temp;
3 ^" j' i+ w3 p  Z4 Z) gQuery OK, 0 rows affected6 {( u3 x& m+ w
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:3 b, d, P% l. V
mysql> create temporary table temp as select min(id) as MINID from student group by name;7 {0 m% e+ O, h+ w7 e( B
Query OK, 3 rows affected
( m2 m& T" c/ C7 VRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
3 T4 J6 y) n; V9 m, }5 A3 ZQuery OK, 3 rows affected
mysql> select * from student;& D$ E  A1 e* D3 S5 ?
+----+------+
7 o; Z5 E% r3 Y% X5 j' {, c' {| ID | NAME |8 ?1 V9 M5 f* e- G0 P
+----+------+# o9 @/ @5 L- G8 B% u0 q# C) {/ _
| 11 | aa |
9 T- V! f) e: S' V| 13 | bb |! D' X' Z3 {3 l9 i% E8 _  p
| 16 | cc |
, d6 B3 Z+ `7 F: t( I+----+------+7 `1 A( H7 V3 l5 ?
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
$ X( _# h  \: x1 ^9 Y" @1 d执行报错:1093 - You can't specify target table 'student' for update in FROM clause6 D4 h6 W6 A; }5 L) R4 @: W
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。3 v9 @& d) P7 o/ {7 k) j6 x3 O
怎么规避这个问题?- X1 Y6 m6 ?9 d5 ^1 Y
再加一层封装,如下:
, T/ K# q+ m3 ]- tmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);7 n% M+ R! a  V
Query OK, 3 rows affected
mysql> select * from student;7 Q  t5 k  v; Y+ k; z  B/ P
+----+------+% x3 W5 Q2 c0 l4 v( H, `/ h
| ID | NAME |' X( g, k" [$ G  H  {, ^% `2 ^
+----+------+
( y8 V) n4 N* I2 q4 E2 f8 R. C+ a| 11 | aa |; |/ B! M. i( r6 @- ]# [; }
| 13 | bb |
0 Q6 C$ k0 Y! P5 B- a| 16 | cc |
0 g. [6 a9 A0 _6 ?- ~+----+------+. \5 `! ]5 f5 e. l* N# [
3 rows in set
+ M& r7 s2 o# W( Y! q! Z
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
/ `. [7 a% A1 i' ^) v) y2 I, n) x
5 }" F. W' b1 q* M2 H/ W
回复

使用道具 举报

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

本版积分规则

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