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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
$ s" o7 g) d1 b% s3 c7 @1、创建一个临时表,选取需要的数据。
( `5 @4 b5 V. I6 `" v2、清空原表。
* f$ V( F) S* Z- Z  m6 k+ F3 P9 ]7 e3、临时表数据导入到原表。
( T) i* {0 {- D. B3 S9 z  f4、删除临时表。
& Q3 y$ D/ D* e# y+ A1 ^mysql> select * from student;0 D! a0 R" f: ]( w" N2 V" G5 _( M
+----+------+
0 z# D; g* q6 _0 Z| ID | NAME |; x: ]& f" \- c, D3 S" C0 ?7 a
+----+------+
6 V$ }0 [9 P1 ^  q5 G/ F| 11 | aa |
$ G# G3 O* G& }2 u9 V| 12 | aa |( `( d3 }4 U2 r6 x; Y$ C( B) t
| 13 | bb |+ i0 W+ z6 @4 T! O; b( S/ ^
| 14 | bb |
0 ?: L! v0 c; x' @! G" D2 d| 15 | bb |
. @+ x( Z" f) p! ^* q3 U* F" s% N% K| 16 | cc |5 U4 H( L8 A! f$ `+ H7 R
+----+------+3 d; R% L' K5 n! x3 p& r: j
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;& [" Q" }0 A6 V& j$ W, y
Query OK, 3 rows affected" O' x( a) {7 u& Q; M! M  M0 |& @
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;; p7 X3 V# s8 j9 Y: W$ y* K
Query OK, 0 rows affected
mysql> insert into student select * from temp;
7 r: I" a) L  CQuery OK, 3 rows affected
2 r5 @# K* ]6 t! LRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;/ K7 W) E* H3 Z# ?
+----+------+
% e  {- v* g: c, Q| ID | NAME |
4 ^9 s- h' G9 l. F/ S* S( G( P+----+------+; \4 _9 j$ x% }1 M! N, [
| 11 | aa |
5 `( V$ i3 n, c' p9 Q: C  r( L  k| 13 | bb |( R" R7 ~% {- x+ J
| 16 | cc |
" e6 I9 e1 ~$ f/ U' b% n0 o, b+----+------+9 d1 P+ Z' }. Z8 u) N$ k2 w
3 rows in set
mysql> drop temporary table temp;
7 f5 y" H) H7 a+ g/ m9 @Query OK, 0 rows affected
$ P2 N- c% F, H/ `这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
* E" R" _  j' d# U% a9 omysql> create temporary table temp as select min(id) as MINID from student group by name;) z; J6 N, B2 d7 }
Query OK, 3 rows affected  c* m8 o1 |4 k5 A
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);. M" s0 ^- U) H( @
Query OK, 3 rows affected
mysql> select * from student;/ E0 ^! }" i4 y/ D! H+ Q" q
+----+------+6 Y$ Y1 \0 x! ?* R( L1 ^
| ID | NAME |
* `( C  P1 n2 `" ^4 V0 g+----+------+
  ]) b% m' X6 v# D! x  a| 11 | aa |7 w( n0 Y1 K, n+ Z
| 13 | bb |
1 A5 U3 V7 @; M; O  C| 16 | cc |
1 y# X+ i. ~% T+ n5 m7 Y+----+------+
* w3 D! ?  u( `% T$ F3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);6 o1 O2 N( \0 [& ^3 t1 j/ C( m# V; C
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
. c8 \4 _$ @/ \, ?2 n6 S原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
! x; c2 X: |0 H. h怎么规避这个问题?
! I3 y# L* A) ?) L再加一层封装,如下:
/ z: R  R/ w+ y9 z& m4 y$ Gmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);* U  m! G$ D2 s* ~5 C/ B) L$ s
Query OK, 3 rows affected
mysql> select * from student;* ~6 U% M5 Q- k( h  g+ w
+----+------+8 s! p( D1 g& _
| ID | NAME |
, |& H6 H) {9 x" I7 G  r/ k# h+----+------+/ F; {4 Q8 C5 y4 b4 Q8 I# Z% e9 l' l
| 11 | aa |
, K% |7 J2 L8 [8 }/ F. n- R| 13 | bb |
- G3 D- D' W5 b$ W& ~5 n| 16 | cc |! U  O) ]/ x3 J# N! @& T
+----+------+
# A7 X; T1 r1 z* }% m3 rows in set
4 {3 `5 I. a- w+ Z; E& v4 a* p
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);6 D* y; A5 c+ G4 n

: C* X# @' a* A3 g7 c3 l4 {. ~# \1 b+ n# R( z
回复

使用道具 举报

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

本版积分规则

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