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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:2 f2 f: i( l- f, Q- e  Q& S) c
1、创建一个临时表,选取需要的数据。$ S. W3 q" z5 y- L7 F, ^& \
2、清空原表。
0 P2 U  n; a3 K; _- T3、临时表数据导入到原表。
7 k; Z5 ^1 J4 c. z' J$ p4、删除临时表。
9 |; X/ ^% N/ d6 M5 y( v1 Fmysql> select * from student;
( f$ [/ F: p) f; e3 o2 Z3 f$ U+----+------+) s0 d3 O- L6 K; l) N& z; G# G
| ID | NAME |6 G9 y; L' \- b7 {& ]
+----+------+
8 s) v+ [2 p+ H; t6 {/ e| 11 | aa |
* r+ L# `& P) E& X! }| 12 | aa |( |& U" H5 h7 ^, D
| 13 | bb |3 `3 e6 X  [4 k7 ]/ J
| 14 | bb |2 Q. f. ^" w, q' e
| 15 | bb |8 Y8 X' h; @) L! f; ^
| 16 | cc |  `6 [* m& T. y
+----+------+! i, Y- X* `; v% x3 t" j
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;& {; K; h* N& T' b2 D
Query OK, 3 rows affected4 V2 `, d3 k+ D0 ?% d+ E4 \, `
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;
* E7 n8 ~2 {! u" |( G2 pQuery OK, 0 rows affected
mysql> insert into student select * from temp;2 _* N- C4 p. N; j
Query OK, 3 rows affected8 U* A4 K4 a2 n; Q6 z" T
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;7 U# L6 \1 A4 G# E9 A
+----+------+/ I  n+ \1 t: y/ E
| ID | NAME |2 {, `+ V' c& d% [1 L) F' b
+----+------+9 g  I" |$ _. T& M7 G
| 11 | aa |
( s& X3 z1 p# p$ S6 `| 13 | bb |
- j8 q$ l9 E/ w" ^| 16 | cc |
& [: x! r" _8 `$ f: D# M' L$ G- B+----+------+
# H$ d! l0 O) u# E9 \- k1 A! V3 rows in set
mysql> drop temporary table temp;; @* b, W2 d& a. a% E
Query OK, 0 rows affected
8 a6 Y  j3 ]% L7 i- f# K这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:0 K1 `0 R( h. Q* O) u* Z
mysql> create temporary table temp as select min(id) as MINID from student group by name;- ^  B: x: n( q* r
Query OK, 3 rows affected
# [& k3 N3 I7 t1 }+ `Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
* u+ q- f( N# A! f5 n6 FQuery OK, 3 rows affected
mysql> select * from student;
" [* x9 }. B, R9 N5 X% P2 e% s6 G+----+------+
; D, x5 |) d' a: r* c5 Z| ID | NAME |
, I2 d) Z' H/ }4 A$ W7 g& _+----+------+
* Q: f3 y5 _6 x$ A| 11 | aa |2 M9 v$ d2 y: ^/ [6 y
| 13 | bb |1 u/ |: H: }0 Q$ k: x. g' k
| 16 | cc |. e4 Q7 k8 m4 ]) G
+----+------+$ ?3 b# H  ~' w9 V  ~
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);( U! c9 K+ t/ M; o: \8 n
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
& `. J5 u  R. D# d" B' [- o原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。1 Z( Y0 X) c; q" z
怎么规避这个问题?
/ O$ J1 b2 G' K1 F& ~  u# U* l# X再加一层封装,如下:
% B+ R5 q6 [0 C+ {6 x/ `- Smysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);3 K" H- p% i7 h5 W
Query OK, 3 rows affected
mysql> select * from student;
% F% X) f2 A3 t: S+----+------+
% w* c. v; ]0 J| ID | NAME |
' ]( ?" i! J4 ?: `+----+------+
8 @: C5 g0 h9 P6 Z& w, q| 11 | aa |1 K0 d* N0 |% Y# E8 W1 g
| 13 | bb |4 g. J3 `( z# s
| 16 | cc |
9 ?" k. |9 R( g- ?+----+------+
3 H6 J  R- K/ z& b0 _3 rows in set

) |2 J3 B9 T& D$ C* }3 N) r9 Z6 I方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
) ~" V/ J2 z/ b- W! j; L% V
& B: g1 u8 H. y  q) z
4 C% Z- h( S5 ?1 X% S: Z
回复

使用道具 举报

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

本版积分规则

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