找回密码
 立即注册
查看: 2807|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:* H3 _' z: t5 v1 ]
1、创建一个临时表,选取需要的数据。8 g) A, r. P8 |, v/ b
2、清空原表。
. t2 l: C; D  d" j6 u3、临时表数据导入到原表。# n3 ?7 t; y- l
4、删除临时表。
% Y! |& |+ z" R- \, X) B% rmysql> select * from student;
9 F1 y+ R6 S% g1 ~+----+------++ o1 A. l$ y, H# L3 b5 U! T
| ID | NAME |/ q( U: E9 ]! E0 L1 S
+----+------+! p1 u5 p5 l) u7 k! ^
| 11 | aa |( y. c7 K1 e* P
| 12 | aa |
- X, D1 ]: z1 @, e5 J, ^) \| 13 | bb |
4 g6 z3 w! n8 ]7 U: O: ~| 14 | bb |
& ^8 R$ d- K& J: v) a$ L: s' w| 15 | bb |
3 T2 V# w9 \5 L4 m6 H| 16 | cc |
6 q5 ?2 |; H1 p$ W; F' q5 a+----+------+
3 k5 c( X$ F9 |: l3 x* s, {) i- [$ Q6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;* x2 [+ V1 v# H
Query OK, 3 rows affected
6 j  N6 m  N4 O/ a( W7 j' SRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;& L5 K2 h5 p  T! r& k! @/ c
Query OK, 0 rows affected
mysql> insert into student select * from temp;& v5 L! R6 g% Q1 M# V) g
Query OK, 3 rows affected
% [3 _# u: c5 B! lRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
* E4 X* k- F+ g* G+ n# o: [+----+------+
1 G! r- n$ ~: M( S| ID | NAME |5 M3 s( `  y& p- n* q$ }! ~
+----+------+- \+ Y8 @; F1 h8 ?$ z
| 11 | aa |
, `' `, s  }/ `- Y  o( C| 13 | bb |
; C1 G; Y  A0 i2 t% _, i| 16 | cc |
1 M' F4 ~: y) J2 c+----+------+
0 O2 H& r+ x" y' y7 x; p3 rows in set
mysql> drop temporary table temp;9 j! V4 T0 q, p! z' n/ h+ I! H
Query OK, 0 rows affected
5 z9 f6 j4 Q" I5 w- l7 \5 f这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
$ @3 b' j2 s6 q0 C+ r" zmysql> create temporary table temp as select min(id) as MINID from student group by name;
5 o" n5 t8 m8 s5 M6 I! [: Q& qQuery OK, 3 rows affected5 v! G. e; M' q: X
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
4 ~- T, J% L# g& v* n1 h( yQuery OK, 3 rows affected
mysql> select * from student;1 V& @. g& n# Z) G, q: O
+----+------+  w- q, ?6 j  n9 v
| ID | NAME |
) ^$ F% D/ }6 q4 i" r! X+----+------+
. S: a5 M1 W: p| 11 | aa |# _/ ?. s& N. ^8 n5 k1 o+ p6 ~
| 13 | bb |; u, a9 D: q; r. @+ g0 S- z4 N
| 16 | cc |. U/ E7 E. {, ~8 h
+----+------+
  j) }; Z1 {, z! g6 D% s3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);9 {- U+ ^, j7 g& [1 W9 y8 q9 \
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
2 a. c& W( J* S. R( `4 o原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。  t: l. o2 H! M( i
怎么规避这个问题?+ ^3 ^' H2 E) ?, I' i
再加一层封装,如下:
! T- R# N5 a* @* Cmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
# \1 c6 G7 v5 G5 D! PQuery OK, 3 rows affected
mysql> select * from student;
, |" V- R6 a0 Y7 S3 Z; `+----+------+
* ?, {+ r, z) [8 ^$ z* x9 || ID | NAME |
( U# y% o6 }% h7 P% O+----+------+) a" b7 L( e2 y, H2 b
| 11 | aa |' r, N4 m: X: W% V% J! V- Y
| 13 | bb |
  g  E7 u3 x+ i" [% e| 16 | cc |& M+ G7 o! D# A+ Y# Z# ]# e% X
+----+------+
, \1 C1 X% D& P( A. j3 C3 rows in set
( F* ~" R$ N6 ?- _5 l
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
" J/ p: |" o4 _" v& O4 Z) I
. p1 x0 Q8 X5 s8 @  d# }. O$ D7 }: U; \, ~% C
回复

使用道具 举报

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

本版积分规则

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