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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
方法1:( |6 V! p8 S( B* D# V
1、创建一个临时表,选取需要的数据。. ^; ^+ N6 {, F# k. R( p
2、清空原表。
) @6 u! w+ U  T8 \) S3、临时表数据导入到原表。$ G/ N' ~8 X' Z) {  ~. K
4、删除临时表。
' p2 V- `) }8 gmysql> select * from student;
$ n; Z1 a  D  c1 T+ j5 o% X+----+------++ M/ z. q9 R! D  T$ N3 D
| ID | NAME |. h% W( A; ^4 |- S" S; F
+----+------+
+ ~, x+ K9 t! ]9 R6 }! ?7 L( W| 11 | aa |
3 R2 J5 ?3 o) G. s9 V. K: o| 12 | aa |- h" ^- \$ U; D# C/ D3 l
| 13 | bb |
$ ~( d7 _/ C" _  c| 14 | bb |2 P; O. a% j8 K! C- z
| 15 | bb |, ~5 E. G+ u6 T, k( ~
| 16 | cc |" J6 K; k4 r$ F. p) [
+----+------+% p# o, Z5 `  ]1 M& U# r! ~
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
4 ~5 j: N7 N. f- Y5 u5 w% yQuery OK, 3 rows affected9 d# i! L1 p2 f9 Q
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;" Y: S7 G) Z( j2 p% Z. M
Query OK, 0 rows affected
mysql> insert into student select * from temp;
% w' v* A* P$ @" {# q3 J! CQuery OK, 3 rows affected: |. a* w! _- v" G1 @2 i  V/ l
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;. [4 L$ T# H) S& O1 q
+----+------+8 Y0 K8 v4 d* s9 J& [$ E( ?. o
| ID | NAME |1 J" |, |5 R) ^  K' a: g
+----+------+
' O8 D, ~1 }0 || 11 | aa |
0 ^0 q* O" h$ n* d) u. M" b| 13 | bb |! P' z/ j4 z( f2 N
| 16 | cc |
: f, p5 E8 s0 w+----+------+* e  X$ k" ~* I' |
3 rows in set
mysql> drop temporary table temp;, ]! ^8 U$ k9 |  Z( r
Query OK, 0 rows affected
& `. P: Y) P2 ?5 X& E这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:) @/ D/ D4 m2 b* Y" Y& y9 p
mysql> create temporary table temp as select min(id) as MINID from student group by name;
9 x  d! T- z/ ^; D2 ?6 JQuery OK, 3 rows affected  W6 {% @2 K" t
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);3 ?1 I* _) r3 g! A
Query OK, 3 rows affected
mysql> select * from student;
8 E9 z, p5 u  u+----+------+% e# n! G  m$ w4 ]' K& z
| ID | NAME |6 W2 A* p/ p5 E& n+ C! g9 K
+----+------+# t, J" V! T$ J& i
| 11 | aa |! }8 c" r4 ~! p- J& O) v5 ~7 k
| 13 | bb |( G9 L4 q' ?1 J. G  X9 A
| 16 | cc |
' J% ~" K" h9 Z% i+----+------+9 q+ y" m$ I! d* R) k" }4 t- R; \
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
* ]8 a' F: P% l  X执行报错:1093 - You can't specify target table 'student' for update in FROM clause6 u5 P8 o9 M7 D4 k# {( j& L- k5 W
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
8 a- n7 J; k$ d9 [; x怎么规避这个问题?
  N/ O/ w: A8 N1 l+ v8 b再加一层封装,如下:( k( ~5 S$ a9 A
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);* {4 h) `0 v! B' _+ B  [
Query OK, 3 rows affected
mysql> select * from student;
) ]2 k( M) o1 F* P$ ?+ o: B, N+----+------+- ?2 `; _$ _; e: d# U; _
| ID | NAME |
  W8 f' n, ^% L! w+ T& w+----+------+
/ o8 |2 U8 S$ I' x3 V: `| 11 | aa |
' m# R7 t+ i7 J6 _1 {7 j. L  `/ k| 13 | bb |; _  V& k3 v! I1 z1 ?8 T
| 16 | cc |/ b- N; T  W1 \0 X' S
+----+------+6 k; v! u3 q9 B( I& a+ j* \. o
3 rows in set
. H8 m+ R; E0 b. o. H
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
' U; Q' L7 d* L$ l+ [' V) L3 `
8 @$ R7 o. V" L3 Q2 x7 F
回复

使用道具 举报

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

本版积分规则

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