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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
( n6 F& J9 C4 E. `# O) t9 A% [1、创建一个临时表,选取需要的数据。% e( Z3 @4 O: E% X' m
2、清空原表。% [5 z0 k1 h+ G( i% r) d3 v* {0 ^
3、临时表数据导入到原表。0 p4 n: D) P, @& i
4、删除临时表。
; ?. H1 c+ u: mmysql> select * from student;
% q* h, a& l. D6 s: d8 r6 S! k% Y  }+----+------+4 g8 ]) o) y) @4 [8 b
| ID | NAME |
4 ^) S8 F: s# C+----+------+
. u. g3 }1 ?: _$ s| 11 | aa |% M1 t: {7 Z5 j6 U, t
| 12 | aa |+ H5 J: g6 Z  W% G
| 13 | bb |0 f$ _2 y/ U0 P3 ?# F
| 14 | bb |0 |; u( U$ L$ W/ w' y- F
| 15 | bb |
7 X" P: Q0 y6 H| 16 | cc |7 E: |2 f' _+ W4 }
+----+------+
; b: k; n: A% ~) _6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;& v( w# V+ P4 }* J. E
Query OK, 3 rows affected! E+ z0 j- B9 p
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;8 P! z; f3 t8 A# }$ [  ]: K
Query OK, 0 rows affected
mysql> insert into student select * from temp;
, |0 @' U' F- K! c. V& {2 Y: JQuery OK, 3 rows affected
" c' u- F; _: I( C8 {6 aRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
0 `$ |$ F% N/ j) @' l4 E+----+------+
3 o; {& L) L2 K2 g7 M  m| ID | NAME |0 s) e% `; u9 r  o6 p. \
+----+------+
! @8 a( p; e2 l* E' E" L- c) h' Y( J| 11 | aa |2 j6 s, h: o/ r4 I; O' h" {$ b
| 13 | bb |9 f2 u6 B# A- L( n
| 16 | cc |: I& ^. K- i# i* @' A! H
+----+------+
( \4 @+ O# X& W2 E  `3 rows in set
mysql> drop temporary table temp;+ h2 x# M9 I+ G+ \! w  o
Query OK, 0 rows affected
; k3 {6 d+ {7 i: ]这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
2 L4 @+ C( ]2 E+ R8 fmysql> create temporary table temp as select min(id) as MINID from student group by name;8 {' U9 g/ G) y9 p6 W
Query OK, 3 rows affected
4 H3 X& v. A4 j7 f# QRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
  y' M4 w# o, S2 J) G! r1 L9 M3 mQuery OK, 3 rows affected
mysql> select * from student;8 W# o3 V0 v9 M# [6 |$ I
+----+------+
8 P3 u3 s2 D* B, G; v3 D! G9 O| ID | NAME |- t9 H4 H# ]9 y* o
+----+------+
, N  p% O, b) m" x, T0 c7 i| 11 | aa |! A# k: `- V( V$ o+ r) m
| 13 | bb |
5 z4 k( f1 C& G9 o1 \| 16 | cc |
: ~# T3 ?1 ~. m) w& l  _+ |+----+------+1 y. T1 m8 _1 R- n3 U
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);; `* K$ k) f  o* D
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
+ j' t/ ]) x) a2 O' J& G原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
" j) ]& z) ~( ?; e1 x9 X; e4 l: l怎么规避这个问题?
4 [- ]  C% A4 |# w+ _2 j% i再加一层封装,如下:. k$ P4 B( k5 R  Q) j$ N1 N
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);$ H0 ?/ w; _8 T( U
Query OK, 3 rows affected
mysql> select * from student;
* y9 |$ J) |1 D, K; R: ~+----+------+
' t6 _! S" z3 `7 J* v$ F6 t6 R| ID | NAME |- `( ?3 ?4 M: t7 Q
+----+------+: S) D( f6 j+ v# H
| 11 | aa |0 J! p( I( U, s
| 13 | bb |5 [% n, S. Y" C" i* d' \# y* T: n7 b
| 16 | cc |1 J1 D. `/ S2 s) j
+----+------+
( b3 I* m% X3 l) C3 rows in set
: q% v+ R2 k6 l# P/ J
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
+ v7 w9 I$ b1 K1 k" Q5 ?" l4 ~6 w' G/ J( g

: t: s7 a$ f; I7 G5 V
回复

使用道具 举报

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

本版积分规则

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