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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
+ f. X: W$ R% K6 H9 h1、创建一个临时表,选取需要的数据。6 ~% l( c% @0 g8 q9 Q
2、清空原表。
/ e7 _% p" O. k3、临时表数据导入到原表。( `! M1 Y* ~1 Z5 w) @
4、删除临时表。# E* x* H4 Y, Z# e; F
mysql> select * from student;6 n: G! @0 Q! k$ D
+----+------+
( [! x5 a7 f4 u" j" ~| ID | NAME |$ r/ v( e+ n; E% ]3 N; s
+----+------+6 b4 q1 I; o& E/ d* q0 U0 u
| 11 | aa |2 i, x8 t; r& }9 s+ W  c" `
| 12 | aa |+ m$ w4 \% ]/ `+ P  m6 T4 B
| 13 | bb |
6 M) d1 D% _5 S# G| 14 | bb |. @" D: H% j7 C8 T+ i& V
| 15 | bb |
0 \3 o5 z5 S/ X7 ]8 ^5 P; V| 16 | cc |
7 r9 V1 l5 V" I/ C5 d8 m+----+------+6 E, C+ V7 V6 _* m+ x0 ]/ b1 Z
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
3 H. K1 E* o3 D# E% cQuery OK, 3 rows affected$ ^3 Z; F4 C" t" p0 }& L" `3 I' ]
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;) Q7 V/ _9 O9 P; X, l1 o. x
Query OK, 0 rows affected
mysql> insert into student select * from temp;
5 w1 W2 y8 ~+ h% F2 H1 dQuery OK, 3 rows affected
9 m7 N: k1 p. K; U/ b8 `Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
, T3 p, {7 B  o' U+----+------+( W5 S9 @, X- @; ?. s4 |1 C9 N
| ID | NAME |/ O$ _. C8 `/ t% D* ]
+----+------+
' R5 E- n/ @3 B- c, f. m; K. J| 11 | aa |
& ~* y. S( n$ |7 _. S9 `: ]0 ?| 13 | bb |
" r& h) ]+ h6 @1 f  }: p! [' b| 16 | cc |
9 N; @* C: f0 j* d+----+------+
5 |7 n3 C- [# u) w$ s3 rows in set
mysql> drop temporary table temp;5 Z4 D0 Q0 ]+ R4 r* X
Query OK, 0 rows affected
! P8 l& I" a$ `7 @% i7 C; F- N' ]( S这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
- _2 v! p3 ]% G: Mmysql> create temporary table temp as select min(id) as MINID from student group by name;/ F- _, j  c7 ?5 f+ K* ^: K% N
Query OK, 3 rows affected
. j4 u7 [! B7 v& ]Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
7 g* s! H. @/ O* J6 P2 nQuery OK, 3 rows affected
mysql> select * from student;
# ]% U$ X( x! d5 }+----+------+
4 `, h. U4 l: `+ s' q( K| ID | NAME |
) K" [$ S, D( b/ _& P  r/ w+----+------+
. w* }+ _( x; _0 o' \| 11 | aa |
. Q; R- {% t* n! N0 B. E| 13 | bb |, n% D* Q7 a* s5 f0 y: p$ x
| 16 | cc |7 R' R$ z) D7 J0 }4 l0 M2 p3 |% N
+----+------+
; s$ J6 j3 S6 n3 L7 x& J3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);8 N, T7 m  f( o+ d7 g* U+ @7 e
执行报错:1093 - You can't specify target table 'student' for update in FROM clause8 a$ e9 L* z2 h' }
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
: D  N  |1 O' u. N* E* A怎么规避这个问题?
- `- x1 I7 Y) C6 ?7 M! q0 t再加一层封装,如下:
0 j* U$ U. ^* e6 fmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);& ~$ Y' s0 j, [0 _
Query OK, 3 rows affected
mysql> select * from student;) E  [. z; Q( d1 N+ F  B$ P
+----+------+
" N9 h& Y: J) }$ U2 U9 U9 f| ID | NAME |
4 B2 f6 r7 v' Q! O+----+------+) a6 e( T% s9 _$ F: I. l) q  x
| 11 | aa |7 X, e4 ~+ Q! ]; t" U" f/ [0 h
| 13 | bb |
& M/ v  u7 Q0 g  B| 16 | cc |  }% I$ V# R( _9 T( b
+----+------+4 b/ y* S- n, E
3 rows in set
7 _$ X  d0 C7 G" x# D( @# D! l3 }
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
. w- x2 X3 S6 n
" P% l7 C9 C7 \7 t2 t
3 f! R4 N; t2 R3 W8 D( N. f0 }3 ?
回复

使用道具 举报

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

本版积分规则

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