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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
1 {- H9 T+ W$ d' J+ h! S- v; Q+ t1、创建一个临时表,选取需要的数据。% M( E1 `7 P9 _
2、清空原表。
6 M2 z0 u" s! h" b5 c& L  m6 l9 e2 w3、临时表数据导入到原表。
4 d3 S7 R0 g7 d% \9 d! L6 s4、删除临时表。4 o  \* Y. h4 ]" e) X
mysql> select * from student;
  M: }+ u/ P1 P: v5 \+----+------+0 D! i$ k! L3 S- _
| ID | NAME |+ u6 w% p: z4 h: i3 z
+----+------+  b8 w& l9 V5 Q* Y3 N& v8 h- R0 x+ C
| 11 | aa |' J. \4 O0 E% X: a! X6 @
| 12 | aa |1 N9 \, }# H/ B6 S) X" z
| 13 | bb |& a9 [" L7 `; V9 C
| 14 | bb |
% v! U; w, R5 {6 c' Q; L, I- }| 15 | bb |0 `( ~# E/ @' \. [/ B# N
| 16 | cc |5 G2 r. c' M# l
+----+------+
. L" W2 Z9 H4 c1 M2 M: }6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;3 _' ?7 V7 r; L
Query OK, 3 rows affected
" G  p3 n2 `3 }! C: dRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;1 n5 {& i/ y" F5 a: M
Query OK, 0 rows affected
mysql> insert into student select * from temp;
5 G3 c+ @  b1 m. `: ]: a. P" YQuery OK, 3 rows affected# F' ]( s% H4 a& {  d  l0 j2 ?
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;- Y9 k* f" |. i0 U7 {' Y
+----+------+
# z2 p) V8 N  I4 b1 C# w$ u/ u| ID | NAME |
3 w  P1 j. b- V! c+ v% R* g+----+------+
* R; e. P/ o* k4 J- M, P| 11 | aa |
( G, t  a; ^4 }3 E| 13 | bb |
, S) a4 [, O' F! z8 y( d| 16 | cc |0 u8 [0 J' _' D$ o  J
+----+------+; _( ~2 t4 v  C7 B5 j& M$ p
3 rows in set
mysql> drop temporary table temp;
+ S8 e7 n1 H9 w8 lQuery OK, 0 rows affected
% w( S) [5 _* K  q: c! j这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:+ i3 O4 K: ^2 q2 w' k! g# t. g
mysql> create temporary table temp as select min(id) as MINID from student group by name;8 v; Y! _' b. L% a+ l; s
Query OK, 3 rows affected5 @7 h6 y& c3 y4 w+ G: I6 n
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
( C$ `" b, Q8 H: k! P  W9 [7 k0 m2 KQuery OK, 3 rows affected
mysql> select * from student;  J2 i4 w! m" d' O
+----+------+3 l2 k4 ^( t  G  t# |& Y5 K7 i6 ^
| ID | NAME |
# Z! o7 h. \3 R/ |9 W( x( {+----+------+
/ |6 G5 d$ |+ V' W3 {" _| 11 | aa |
. Y/ S0 ]5 [7 g9 R| 13 | bb |6 z; `$ W) x! U
| 16 | cc |3 M- M3 ?7 Y. b) |) \
+----+------+9 x# f& C8 i4 e2 J
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);) q8 v$ q+ O+ y. Z; A" h
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
- U. p: R) H/ a: ?原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。  j; Y' g/ b8 z; s  l
怎么规避这个问题?
- X) Q$ F2 X8 A! ~: ?( n再加一层封装,如下:% T" E( W9 t+ A3 W# G" d
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
9 w, U& N* _* f3 Z2 AQuery OK, 3 rows affected
mysql> select * from student;2 c3 n: b) K8 B4 @) I$ U: Z" N
+----+------+) s- i2 ?7 G( v5 z( o; \+ C
| ID | NAME |& Y4 [0 A* R: D1 d: b
+----+------+
5 P  G  ~# P$ w- m" N| 11 | aa |
7 L9 H) H4 Z5 e. L- [% ^* B| 13 | bb |8 k1 L  E7 |+ q
| 16 | cc |
, x; L+ R2 W5 _+----+------+
* Q0 a$ D9 [6 `; `4 H- H% i! G3 rows in set

1 k4 _8 u7 D4 S1 X方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);) o7 e, z' v) P8 \8 k

; w1 i+ ?/ L0 w) ?* R
' x  c9 Q; B& }
回复

使用道具 举报

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

本版积分规则

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