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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:7 ?, z: I2 M% I. N9 o) j/ @) i# z
1、创建一个临时表,选取需要的数据。
( i6 m* q" h7 E9 q0 _2、清空原表。2 I+ l+ Q" j5 c+ I% h/ r, e0 L
3、临时表数据导入到原表。
4 h* V3 q7 N, ?. Q# v! A8 [* Y+ {4、删除临时表。
) |& w% l( ]- X# _+ imysql> select * from student;
0 ~+ y3 }# W! k4 g5 A+----+------+- ~3 Z! {! h; d& O+ n9 {. t
| ID | NAME |
+ x2 K- k" Y) W+ I% f- q9 C9 q# d+----+------+
4 I+ T* P: w' || 11 | aa |8 D( B& L2 J6 D" y; A9 M% @% ^  p
| 12 | aa |  Y5 s/ U8 V7 A9 \  R7 H
| 13 | bb |3 z0 P3 p! x% ^! X
| 14 | bb |7 W  S5 K9 K1 u- O
| 15 | bb |
6 h$ w. d7 \5 o| 16 | cc |9 e* l6 [; }5 B7 c' y! a
+----+------+
3 x( Y2 Q: m5 A! |& S" A' s/ G6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;+ C# @, s$ S) f1 I4 n: U, O
Query OK, 3 rows affected
1 r( c0 \. [) P# HRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
  i) l( B( W( C' ]1 `1 SQuery OK, 0 rows affected
mysql> insert into student select * from temp;
0 }: M4 q! d6 ]6 q* tQuery OK, 3 rows affected& L6 o9 l, }2 P! F8 [4 j
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;! H1 X! u3 V# S! S8 L' I
+----+------+% ?& L4 j3 ]) [2 O
| ID | NAME |" m8 \' m) g% a7 f7 K% |
+----+------+) R# \5 M8 q5 D& Q
| 11 | aa |, t% x7 s1 ?: C1 y1 H
| 13 | bb |* c' W' h/ G5 \* x3 r
| 16 | cc |
1 h7 C4 E5 y6 T+----+------+
6 G& ?) N: q, u3 rows in set
mysql> drop temporary table temp;  c2 q; K" D# ]% A  J& f
Query OK, 0 rows affected" i6 ]$ L+ M4 r# l/ i. B
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
* [) ^1 @' ?* |) Pmysql> create temporary table temp as select min(id) as MINID from student group by name;9 R0 R% w8 K$ t/ g! S$ J: |
Query OK, 3 rows affected
* ?# Z. I. }1 jRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);  U6 a+ t! G( {# K$ G; j
Query OK, 3 rows affected
mysql> select * from student;
; m& }6 w' R% B+----+------+
" {! @9 C1 q, U' b| ID | NAME |
7 X5 n8 E4 o6 ^; C8 M+----+------+
$ H! ^: ^) e. D2 V' ]1 i' K  ^2 h| 11 | aa |
: A7 i: G# F. l$ C| 13 | bb |
* `% m: Z$ d! {# d' y) S) t7 y2 y( _| 16 | cc |, z3 _  }" {7 ]$ Z
+----+------+
4 z' u( f/ r. O! w7 X: J) n3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
1 V! d/ J; o, M4 U' g- T2 J执行报错:1093 - You can't specify target table 'student' for update in FROM clause
: b" J- a! U- {0 P+ h3 [原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
" j3 F8 i) {# k# T8 u2 f0 R怎么规避这个问题?: H+ C4 [1 F8 Q) T+ N& ~
再加一层封装,如下:) J0 O, n- v% @" p  Q. E& U
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
) M9 y0 m" y+ T6 {" C+ |+ ^6 m* O* e+ A& MQuery OK, 3 rows affected
mysql> select * from student;
/ b; b1 y5 I* c) v# n3 }+----+------+# [2 A& n; O0 c! P( n* ]
| ID | NAME |
5 ]0 X) t' v1 K/ i" E+----+------+
, Q7 e7 p: O/ P( z7 q$ |  ]$ ]; e| 11 | aa |
! ~- e  P1 Z7 ~4 P- l# Z* R1 B| 13 | bb |1 x, Z, t# m! s5 N
| 16 | cc |/ u: a% H' ~+ {* y1 R! v1 R
+----+------+
% q4 X- ]  r, s) n3 rows in set
: K% M% q' x( r6 ?# D
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
& j, [+ T" u2 q0 y, l: \- G
/ k  S* W% h1 u; E; G! I* c. D  [( [* a8 b8 C8 j4 v
回复

使用道具 举报

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

本版积分规则

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