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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
方法1:( \5 f3 T$ Y$ S0 h7 c
1、创建一个临时表,选取需要的数据。  J  q7 [& t3 Z  `
2、清空原表。5 T5 R& z" W  r3 `
3、临时表数据导入到原表。3 |7 a7 s: ^% o7 i
4、删除临时表。- P+ M5 w5 U; o. u
mysql> select * from student;3 X, ~3 k) v- F
+----+------+: v8 _0 J( X3 c. N- n, ?! o# d5 Z
| ID | NAME |6 F1 m* V* c4 B
+----+------+
3 i9 y6 B3 c) V4 m# {| 11 | aa |
, f- q( {- u, B1 p8 {| 12 | aa |
2 u" M2 _3 x7 W3 q. n/ P' d| 13 | bb |
9 `2 T" N2 n3 u, r| 14 | bb |
' ^; g9 ]: j  O1 d% ~| 15 | bb |
: L+ r8 j" ^; G6 X| 16 | cc |% C9 ]- Z, e$ u- W
+----+------+
9 S) L; o( Z5 [' f6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
* _4 j4 H$ v% l7 V) L: I/ u5 ~Query OK, 3 rows affected1 C! p& D+ ?4 z6 \) m. ^0 }
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;4 @; S6 z( n" B. {0 `- Z
Query OK, 0 rows affected
mysql> insert into student select * from temp;, `! @8 }7 E1 D( f0 J9 F2 J
Query OK, 3 rows affected
8 U# i8 a! [7 m1 a2 w: ?9 Z/ hRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
" y* B9 w5 J6 w( D" y+----+------+
$ g( d0 w& \1 x  l| ID | NAME |' I3 P3 W# L3 c& T1 |
+----+------+
6 O: e: E! c' J. B2 _7 }( L| 11 | aa |
* D. b, u- ]$ {% P; v) s7 I9 [. w1 q| 13 | bb |
1 }# e: T- @. ^0 ]# p| 16 | cc |
1 |6 e! i/ W& x' {* N) t+----+------+
$ P+ a( @, T" _: g" f* E3 rows in set
mysql> drop temporary table temp;
2 i) B' W& ]  J: H2 N- v+ i; \Query OK, 0 rows affected& y# i' y; X2 a
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:0 f9 [8 t  i' u8 E; e& N
mysql> create temporary table temp as select min(id) as MINID from student group by name;% G3 F- `+ c3 f4 L
Query OK, 3 rows affected$ }& N( H# x7 B' P+ M. ]1 B" A  q
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
. [- D; ?) W# _0 W$ N% W/ O) JQuery OK, 3 rows affected
mysql> select * from student;3 O  ^7 A' Z6 W& [0 _' C6 h
+----+------+
: \9 g" X3 A& I9 H| ID | NAME |) d$ |& o: n$ l; j% V
+----+------+
% y$ q" ?7 b( P# o/ j* b$ t6 L| 11 | aa |
1 b& X" Y! J# D| 13 | bb |: F( M! X$ C% c5 M' [
| 16 | cc |6 d% O6 f8 l6 `) A; _$ H
+----+------+
8 Q1 g+ h) S, u. S7 r3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
4 ^1 n, U* O+ |; q2 l& Y+ d: Z5 W0 D执行报错:1093 - You can't specify target table 'student' for update in FROM clause
- q. Y- h1 T7 p) ]' }  b原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
; c" {& L0 a. y/ O5 ^8 Z3 W怎么规避这个问题?3 e0 Y% {; ?; F* L  I7 {/ [
再加一层封装,如下:
  J: d3 O: n' a: _- t, D8 u- }mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);9 Q  ~: K/ V/ J, o- u
Query OK, 3 rows affected
mysql> select * from student;6 S% K% Q( J! t+ H9 `7 p# N
+----+------+
; S3 _1 A9 i/ Q) G| ID | NAME |
: t' E  n* d3 i6 d( ~4 C+----+------+
( S! E6 Y$ ]& {$ H| 11 | aa |
1 O- L: p6 I; B' M& i0 z| 13 | bb |' C( p& |) r0 ^4 `  ?' m
| 16 | cc |
' }5 K0 Q0 C9 Z+----+------+0 X8 w1 C6 g2 r9 ?5 F
3 rows in set
$ N7 w% ]4 Z4 z) \2 R/ |
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
* a3 a( a  C8 J( o4 e1 j! }% k2 y" O
+ Z; N4 _6 l8 V8 C
回复

使用道具 举报

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

本版积分规则

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