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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
1 S3 p0 S- d% C* M1 k1、创建一个临时表,选取需要的数据。4 w2 }$ X! Y" k, i
2、清空原表。
3 @6 _/ L. Q  t, l+ }/ `3、临时表数据导入到原表。0 }/ V& v( j$ N4 F. ~9 |5 f
4、删除临时表。+ d2 o- b- S* M$ Q
mysql> select * from student;
: z. C$ h; h+ J! [2 j/ G+----+------+
- ~. t7 ~; M0 k" V' ^' C& ^| ID | NAME |* F+ N3 {+ s0 f; R
+----+------++ n2 D$ }1 a: x0 ~" i% K
| 11 | aa |
% y) G+ @' I, ^7 M9 u9 J| 12 | aa |
8 e& I! m7 Z, U* d4 l( I; L' J| 13 | bb |
( P6 i# i8 d$ l" `! U| 14 | bb |2 i. C7 C5 e" i" \3 @8 }/ S
| 15 | bb |* V5 @4 g7 Z: y) W
| 16 | cc |" T- t# }, f$ ^6 [( z- ?/ X
+----+------+3 [0 w& r  o" u( [5 s* g0 w
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;7 Q* \7 `( z1 |' o/ o7 Z$ q
Query OK, 3 rows affected5 A( r3 V' Q; k1 p
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
" ~. ^8 _0 e% _Query OK, 0 rows affected
mysql> insert into student select * from temp;; v/ B+ _( ?" ]7 D1 T$ k/ p
Query OK, 3 rows affected+ H+ }- f) C7 c/ F8 |, l9 D
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
5 f0 D. |: b$ F; P( {+----+------+$ J. `4 m# P2 k1 l9 Q) Y
| ID | NAME |) w7 m& g. N, H9 H3 ^  |3 @
+----+------+1 k9 M" B3 s( |6 O* x4 G
| 11 | aa |5 v3 f. E5 g! {( H1 S
| 13 | bb |: |' R$ V0 K! ~9 ]' a
| 16 | cc |/ L- L* y2 c) Z4 g. n6 }
+----+------+
3 W5 x, I; R/ K, i) a/ S  g) n8 C3 rows in set
mysql> drop temporary table temp;
' ^9 e1 V. B! z3 VQuery OK, 0 rows affected
! @  Q0 r% C' j0 o  G$ d* {这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:- k5 }# \- L8 k! y# k' _" I9 P
mysql> create temporary table temp as select min(id) as MINID from student group by name;$ N  K- r" ~' g# b7 z1 ]9 a
Query OK, 3 rows affected
* V- _) r! [2 \2 qRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);( n) d2 S0 t' x
Query OK, 3 rows affected
mysql> select * from student;5 }# Y$ l) \( G; N3 h
+----+------+
  L* N* |( G" K* W8 O! O| ID | NAME |
" z( t( X5 T% z0 V  f. [% ?+----+------+
  }+ @/ ]* K0 t: H0 b0 g8 L| 11 | aa |2 `& m3 I% B) R3 w, `. a
| 13 | bb |* ?2 n4 E& y- h* N7 X
| 16 | cc |& r- B4 {2 @/ V9 w( p  f' [# I
+----+------+
7 r5 `: I6 Y9 p; z; w3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);, q( ^+ p7 B; |
执行报错:1093 - You can't specify target table 'student' for update in FROM clause( B, ?+ m8 l; B& ?& q/ b1 j2 u- i
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
* E; T) P! l0 H, Z- N, s怎么规避这个问题?
3 Q  _9 j$ z9 \( O再加一层封装,如下:: \6 N( w1 J- |3 B3 d
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);4 y  `) f& G/ b: Q. v( _1 L9 c. T
Query OK, 3 rows affected
mysql> select * from student;' ^# p( S/ ?4 `
+----+------+! ~# u3 |2 P  Y
| ID | NAME |* v; ?  _7 y1 H. [4 n# y/ ?# B
+----+------+
) W; T( B3 Q: F7 L+ d( O. L4 e  e4 n| 11 | aa |
7 O( b8 }( ^$ q$ S9 A7 ?) N  K" c+ L9 D| 13 | bb |) `& z8 A8 y' T, s4 t7 D
| 16 | cc |  W& ?% N& x  z1 R3 o( N
+----+------+
9 G$ y$ |! @6 L; r3 P) x3 rows in set
" ^  ]* b  L+ z
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);3 j4 @# U; x0 }  P4 _: P- I

# _- w' Z5 ?, O/ v! J: s( F5 h" G- f0 Y- y( p$ G; d, C9 N$ R
回复

使用道具 举报

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

本版积分规则

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