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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
3 m; z( o$ [) N& e( \; `9 s1、创建一个临时表,选取需要的数据。4 H: Y( t7 |8 q
2、清空原表。' P% s- o) q  q" y- ]  e- Z
3、临时表数据导入到原表。
# j  Q: w) Q' q4、删除临时表。- q6 z* w* P% S* J
mysql> select * from student;/ E$ G' }0 u( @- g0 M
+----+------+
5 w! N% G+ Y9 B& E- F- R: y| ID | NAME |0 C8 a( E6 b8 j: Y* |
+----+------+! S2 Z+ O0 J5 b6 k
| 11 | aa |5 \, z3 [, t/ n/ \$ Z. w
| 12 | aa |
  t  f: m1 ?# m4 b9 H+ n| 13 | bb |+ C5 r! g( ?2 [6 y
| 14 | bb |! K* J+ a/ K) R' [2 O. i
| 15 | bb |3 M8 E/ n8 V+ S9 V3 \; Y1 E+ q% O
| 16 | cc |" i& Q6 R6 y. a" G. I6 t
+----+------+3 a8 ~. i1 X% L
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;7 n; B# g9 |3 H7 i6 i
Query OK, 3 rows affected" ?) e! H5 S! j! K
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
. i5 T! Y. c6 q( E& jQuery OK, 0 rows affected
mysql> insert into student select * from temp;
) v) T% d0 y9 C3 rQuery OK, 3 rows affected
5 Y; K' @. |5 W6 n/ q* DRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;# J; p% p( E5 m& b
+----+------+
' H" ], Y; F' e! P) D) T| ID | NAME |
3 f+ L0 S4 W" y+----+------+
8 f3 o) L/ N* a; ?5 k| 11 | aa |
; h+ I: a+ x, D1 b6 }" S: T8 g| 13 | bb |
8 h. z4 A2 Z# i9 c; Q) |, C3 ~| 16 | cc |) Y$ H' }/ M8 t3 P: E7 S, y
+----+------+
( n# Z  p8 E& J- ]' \3 rows in set
mysql> drop temporary table temp;
7 B/ }4 J8 c% D7 ~+ N% MQuery OK, 0 rows affected# S& g9 Z& i& g2 ^- l5 A/ d
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:- o3 ]$ {0 y% ]
mysql> create temporary table temp as select min(id) as MINID from student group by name;/ }0 j8 D: r/ E
Query OK, 3 rows affected
% o( `- F! ?* |7 l. ARecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);5 o  i) C( R8 b2 G! i; f6 F
Query OK, 3 rows affected
mysql> select * from student;
# n# l8 l% u3 T' i1 L+----+------+0 Q% I- A% d5 N- P% e
| ID | NAME |' N9 i# V! F) ?7 h  Q/ f
+----+------+# _! Z9 ~: l7 o; e# Q! s4 K
| 11 | aa |( Y- L( b0 [! H% N. q& l. [" H1 T
| 13 | bb |' X. C: S6 B/ F2 c% |
| 16 | cc |% a- c7 _: _8 b
+----+------+
2 c- Y; H+ U$ }. |/ F3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
2 T5 Q! l7 B+ B  E9 Q7 L执行报错:1093 - You can't specify target table 'student' for update in FROM clause
' S3 D, U9 E& P原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
0 k( Y/ ]$ k1 ?" E+ s; M怎么规避这个问题?7 N! h( v1 C* N' l5 }# U
再加一层封装,如下:- C5 O$ b, Z# E
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);! |$ o) V6 X9 y# j  R
Query OK, 3 rows affected
mysql> select * from student;3 F2 e% D1 B, w( M
+----+------+' D. J4 [, D5 ~+ O3 c
| ID | NAME |- F! p# t0 z9 x7 a0 \5 J& P
+----+------+
" c% X* c' Y1 y0 N| 11 | aa |
. U, a' ^' P% ]" s5 r| 13 | bb |2 C) ]& Z$ p) C8 }
| 16 | cc |: P) s+ V* m$ P2 E, B: ]
+----+------+
9 Y2 u+ v0 s. v) n- a- R) T3 rows in set
# @; x3 P( Z- Y' J8 H  K
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);/ P7 o6 ], C& u! _' e$ P% _  h
: \$ x: x+ h( r% ?1 n  N

- Q: ]0 i8 ^3 o8 N: j
回复

使用道具 举报

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

本版积分规则

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