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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
方法1:7 q8 R+ `! Y  i/ a4 U0 |
1、创建一个临时表,选取需要的数据。" S- e4 V: \% l; ]
2、清空原表。
# R% l+ f  j3 B# F: m3、临时表数据导入到原表。
6 F6 `, l" T% E% e3 C4、删除临时表。" B+ y" g* D; S- _" |& Y' b) l% C
mysql> select * from student;; e7 U0 I: W" }, p+ f5 G4 O# m
+----+------+" p" c- T8 A5 n6 E" W: F2 n5 f' x
| ID | NAME |
4 F( }- I' Q% N+----+------+
, P) t: G' N2 ^6 h! O8 H9 c| 11 | aa |
0 c6 |& D! E/ B% ?+ W' D| 12 | aa |8 s. D% L* {9 A) j# ?% U
| 13 | bb |5 {% K7 [- P, y3 }3 R. t
| 14 | bb |+ J0 o. W- X) H4 |* R( c
| 15 | bb |8 l" K& }1 w+ t1 L* l
| 16 | cc |
4 Z& ?" A( l& b* K, R+----+------+/ ?8 y, w/ x' k  T& s
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;0 N9 s" J# h% K% X( I: ^9 p9 {
Query OK, 3 rows affected
- }" t- s5 L1 `0 a# }" [, aRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
& O6 `: M$ @8 [' Q/ W1 b3 p. y7 WQuery OK, 0 rows affected
mysql> insert into student select * from temp;. m; J% U5 m5 k7 M. E
Query OK, 3 rows affected0 B& o; N. F$ N: |8 E
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
+ `/ u+ y2 x( ]& b+ a" m' }+----+------+
+ V" D5 i3 [# v; J| ID | NAME |' V! F8 s8 J3 o( M+ s
+----+------+
- M' l6 ^& T# `. J9 E  f& O# d| 11 | aa |3 n3 a$ Z5 J  r% w% C& L
| 13 | bb |
  }* U4 w8 T5 c# }/ ^& t, C. f| 16 | cc |0 I% v  p6 D; j4 ~8 u$ O1 c: W
+----+------+
, D, T* n/ x! g. a3 p* u( M3 rows in set
mysql> drop temporary table temp;
6 k" f- v3 o! F! ^$ DQuery OK, 0 rows affected7 O0 x$ q+ O4 I9 L) h4 x$ v9 l
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:4 B- J0 m4 J& f0 ?& L
mysql> create temporary table temp as select min(id) as MINID from student group by name;
  o% n# k: U  _% K$ w0 rQuery OK, 3 rows affected
  c5 C7 G+ l4 I% Z1 yRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
7 e2 i) J1 ^- T! @1 ZQuery OK, 3 rows affected
mysql> select * from student;
9 N0 ?* s# A0 o0 n7 U/ _) \% r+----+------+
5 s. U, h* M) A- |1 }/ c4 L% C# {+ B( C| ID | NAME |& d7 V- u, F" G  R  m  y- N0 n
+----+------+, W$ y0 t* b3 ?* c1 B
| 11 | aa |
9 W4 M3 Y, W' p! k| 13 | bb |. v: i- Z" V1 b+ A. r
| 16 | cc |
" Z0 G  @4 D+ v  B+----+------+
& \# d  W+ ]3 y1 {3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);: r# ]7 F. J0 r! b( h+ o
执行报错:1093 - You can't specify target table 'student' for update in FROM clause7 ^! i. `8 i! c
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。- w" ]5 D0 {- a. M, N  ^# h! N8 o9 p
怎么规避这个问题?
5 M  S7 j$ e; J& |% ]再加一层封装,如下:. j+ q5 Z0 o; ^% k  }) b
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
: d8 N2 Q3 R# |, A' zQuery OK, 3 rows affected
mysql> select * from student;
* ?) R% G9 [8 C* z- X+----+------++ D5 w( @8 C7 @$ l+ P" O
| ID | NAME |
* n6 n0 ~$ I+ G1 Y% }# |+----+------+$ O  |0 L) ^# Y$ M2 a  f
| 11 | aa |
7 |  D4 G7 t/ ]. X5 Z| 13 | bb |1 w) I1 [% D2 }5 e! W$ _
| 16 | cc |
; h( L+ c) R# ^; I. C+----+------+  ~0 w6 x" ], F* S7 s% ]3 g
3 rows in set

# K1 `4 x1 `+ M" W7 q方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);+ i; e2 T7 p8 M5 }
. S1 ?# F' B" n3 @" ?% y
' O4 }/ L! X+ [* Y
回复

使用道具 举报

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

本版积分规则

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