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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
方法1:% N7 m6 i1 a) _/ d8 W. p5 m$ F
1、创建一个临时表,选取需要的数据。7 \% Y0 a. x7 b
2、清空原表。5 q1 b0 `& w6 D5 h
3、临时表数据导入到原表。& P3 g/ s+ Q1 f( P6 t; `4 R) s
4、删除临时表。/ ~/ p- e; {7 C+ I, F$ O, @
mysql> select * from student;
% A& |; X! \' g5 e5 U- c+----+------+
3 b7 q: F" O$ q9 J  A/ z* o| ID | NAME |. J- w( W" J+ c; b3 v
+----+------+
. X! J& w: m) X. M( F| 11 | aa |9 O( ]% [2 n1 ]2 g4 J% ]: @% Y) Q
| 12 | aa |
+ w1 N, |- o# K" r( w( y% e| 13 | bb |
; [8 |( K/ t2 E9 r| 14 | bb |
+ B1 ^4 t7 }) v| 15 | bb |; B* U0 u$ n0 l5 r# K
| 16 | cc |# m7 z" q: [, X! O& Z! h4 q
+----+------+: p7 p& D/ G1 G: r" G) V
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;  v9 ?* q0 N( K- J
Query OK, 3 rows affected
( A  k) d+ Z: t* cRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;6 d6 w4 a0 k, j3 Z6 [
Query OK, 0 rows affected
mysql> insert into student select * from temp;
& V$ `% t; T  @Query OK, 3 rows affected
2 Y4 c, n1 ^/ c/ m$ a- c/ JRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
$ K4 d; x& W* h3 ?' ^9 E+----+------+
  e: S8 Y; W/ @% Y! S| ID | NAME |
# a3 M# J; P) X: W! u+----+------+
3 \7 B/ f- J; L  J/ {% e" `$ ]3 `| 11 | aa |
/ P# X9 G: k2 R/ t| 13 | bb |  x. \% U& v6 D' E6 c
| 16 | cc |- R+ i' b, z3 j8 y. S
+----+------+
. [4 q, y' D! w7 w# n/ |9 I3 rows in set
mysql> drop temporary table temp;
) V) q# v- {5 d6 M6 JQuery OK, 0 rows affected; c' \/ N5 F+ S1 W/ ]
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
( b& D9 d8 q) q# v; l4 Hmysql> create temporary table temp as select min(id) as MINID from student group by name;0 Q" z; M. v: I% c1 i/ k0 Q" L5 V
Query OK, 3 rows affected
5 P$ x! }" g5 h( l8 FRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);( n7 G4 D. b5 g7 ]
Query OK, 3 rows affected
mysql> select * from student;- G& y3 p: z* @  F) W7 L
+----+------+
# G, }7 V: U0 s0 w6 `| ID | NAME |
1 ]* E5 ?8 S( }- X% }+ t+----+------+
! E/ @) c% w9 T7 R& z. v| 11 | aa |6 S+ d& z" `- ~) B8 s
| 13 | bb |5 ]6 b. a( B3 n: p& k8 \* J. x
| 16 | cc |. V3 A. _/ b5 n1 |# T- e- f
+----+------+- u0 v# b, G" S- b) B! v
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);7 o2 V% t( ^5 J. {
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
# [; [: P  ~9 T/ \/ z. o( t9 P& |原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 @. ]& f2 g9 w怎么规避这个问题?
. D7 o) I# [8 J# |% _2 r再加一层封装,如下:, S, b. s4 g$ E; g% L3 f& g
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);' ~  k" r$ S" n( W4 i
Query OK, 3 rows affected
mysql> select * from student;1 |  R3 o+ P2 l& ~1 h2 o; v" Y
+----+------+# Q. J: u" _6 O; x6 N9 |. n
| ID | NAME |$ R" {0 L. ?) I4 @% f* `
+----+------+" C" H3 B$ D. j5 y! @
| 11 | aa |
  i6 d& [& ]* x4 o0 W3 ~5 G# K5 m& @| 13 | bb |
/ _9 l, L; R# h2 s/ j8 q| 16 | cc |6 D0 k; i8 ]$ @- f9 d% i
+----+------+" {  {/ p/ v: m, K' Y
3 rows in set

2 j3 i9 X4 D7 j( {( ]) n) r4 a方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);" ~% E  O& q+ k) E2 B# @- |

( H5 ]" ]) G: R  e5 N+ {, C; j; u- u" O/ [! N
回复

使用道具 举报

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

本版积分规则

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