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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
方法1:) @2 E3 y8 V% e- J8 P2 s* B
1、创建一个临时表,选取需要的数据。
: S8 E$ J% a2 {! u  W2、清空原表。
" ?. i7 R& U. B" l$ e3、临时表数据导入到原表。+ Y- `4 j5 l+ ]3 \* l9 H  m( J0 H
4、删除临时表。
3 k+ |, G5 g6 |( V5 {& O$ amysql> select * from student;
/ j% U( V! c9 T8 m1 K# c+----+------+2 P* j+ V7 ]: Q; X: G
| ID | NAME |# L7 i1 o/ R* u7 U6 V0 G: b4 J, |# l
+----+------+) W3 o# D8 U8 q. y8 `6 `/ R
| 11 | aa |
7 c3 }2 Z  C! \7 h& F& ~+ q( ?| 12 | aa |8 l' v  f/ V# G$ Y  W) `$ C
| 13 | bb |
7 R0 P7 V; |) s8 t* J| 14 | bb |
$ `9 k3 P8 L4 A1 W) H| 15 | bb |
0 u" V! m/ r& |- E| 16 | cc |
/ n' C5 \; i4 G+----+------+/ J1 f5 c+ D* Z7 A
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
1 z& `2 s& |8 o, V1 eQuery OK, 3 rows affected
4 q& [+ f  U6 y) }# }# HRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;9 _: }$ \* a. n: b% d
Query OK, 0 rows affected
mysql> insert into student select * from temp;5 {" Z, v9 b& c7 L  C
Query OK, 3 rows affected
: m) ^5 ?5 D+ K7 B% ?! sRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
/ ~/ m. j3 _; }+ j) C9 {: n" |+----+------+, a; m/ L# H6 [
| ID | NAME |
5 T9 W& m6 Z2 `8 _' |5 g6 {+----+------+, S7 U7 K6 e; T1 G6 q; Q( v
| 11 | aa |. l6 w# D; L" T+ j) O" o5 j
| 13 | bb |
/ z' {5 j5 I! @+ Y) W| 16 | cc |
4 D1 x% J. B4 o# h+----+------+- a1 C4 o5 z& L" l  G) r- i( p
3 rows in set
mysql> drop temporary table temp;# E+ P8 K& ?: I
Query OK, 0 rows affected/ k( E$ U  }: k/ n, U
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:  {! N3 H6 o' Q1 H7 P
mysql> create temporary table temp as select min(id) as MINID from student group by name;1 P/ x" Y$ C, }# ]3 w, X
Query OK, 3 rows affected- j, h  A2 f! Z4 T# j
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);' P7 p  P3 U0 [
Query OK, 3 rows affected
mysql> select * from student;/ l' D& d3 A, O8 M
+----+------+
& B( X; [1 Q' C& E2 @/ l9 B2 h| ID | NAME |
" d# w( F2 N' s7 b. p) v) X+----+------+
$ {6 T) s  t2 c1 N1 T; h| 11 | aa |( u  p( N" D- p( r1 w3 G
| 13 | bb |
% e" y7 a/ b6 G% v  Z| 16 | cc |
- d( i$ {% ?7 V7 H% Y' b2 G9 \+----+------+/ s9 E# R' t5 b& V' W" n. z9 E* |
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
- j7 s' R7 ?% m! K9 H& H. D执行报错:1093 - You can't specify target table 'student' for update in FROM clause& p# O- ^" U1 @- W) P( }, Q
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
& |( F' s/ N& a怎么规避这个问题?
3 {* T8 D0 z8 I3 r4 z' ~再加一层封装,如下:0 X- L3 I* w& `6 W* v1 C1 _% {
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);! c- ~, c: k2 V, `; N# I( h6 n
Query OK, 3 rows affected
mysql> select * from student;' Z' {+ z/ H( m, Y
+----+------+- Y7 q  D/ ~- v# @5 V3 U: A; A
| ID | NAME |7 M+ B% K) d- e5 l5 k5 B7 e9 _$ X
+----+------+
! s3 {$ b  Q: P! ~4 H: R8 ~| 11 | aa |
* `! v# ~2 R2 ?6 I+ q& R- F| 13 | bb |1 D# G& L- Q4 ^! {  F
| 16 | cc |
0 d9 R  M+ G' @6 |. t+----+------+
! W8 y2 v6 ?$ y1 @! G# j6 ]3 rows in set
  M( a% r" O  `# D8 y
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
1 P' n. |0 u" {+ g% g# v
( b: J3 H: a& Y. D4 q" i( J5 e& x' o
回复

使用道具 举报

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

本版积分规则

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