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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:8 e3 A+ {1 `# t; k8 B% \) [$ [
1、创建一个临时表,选取需要的数据。
& n% m" Q; Q. ~; c2、清空原表。. |/ x5 E0 L0 s: t5 j6 c
3、临时表数据导入到原表。7 ]  ~; C- U# [$ @' @3 z! i  O& T( u
4、删除临时表。
; t2 X& |8 k  Zmysql> select * from student;
0 e) ^% q% K: @+----+------+
3 R- }7 i+ t& U) v| ID | NAME |
  }- c$ E+ N7 ?7 p/ z7 j( B" q/ k+----+------+
8 x0 C, Y6 u9 W| 11 | aa |
, B# V& r& a+ f) ?8 _6 r% }- t/ P1 f| 12 | aa |
6 |4 Z: m2 m% p4 R5 ?| 13 | bb |
: n9 @2 v" h! n" I3 h! X7 f| 14 | bb |
. ]0 |, _9 a) r  Z- Q5 O8 }* v| 15 | bb |# ^3 ?# K6 p* g" Q
| 16 | cc |: F" u0 N# a; D$ H) ^. |7 D
+----+------+! g' N- h; a' y, |
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;; E) H, n2 o0 m+ g9 R- A! b) [6 q
Query OK, 3 rows affected
' I. C/ P* B: `0 G3 Z5 v! `Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;6 s2 D( ]0 i) a2 `/ T7 a/ {
Query OK, 0 rows affected
mysql> insert into student select * from temp;- j9 J4 t2 s+ D- I4 x+ {9 b: _
Query OK, 3 rows affected4 ~+ I# g' D6 |7 L. j
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;1 ^, e: c- {" y) [7 q
+----+------+2 J9 ]0 h& C  z4 j+ r
| ID | NAME |
& V. O9 v% f& u) M& G+----+------+
: M4 b, D- H2 c+ w9 h% g| 11 | aa |" I' Y2 C: _$ Z( u
| 13 | bb |
& Q2 M+ H: v+ `2 w: O' Z. f# p0 e| 16 | cc |
  T/ n+ J  V; Z. M1 |3 p: o) W+----+------+
2 a6 L$ R$ l. H5 `3 rows in set
mysql> drop temporary table temp;
  m+ t5 v) @9 M6 P* |( D- R( rQuery OK, 0 rows affected
& W- `6 C0 X- K% t. h* Q) c0 ~5 S这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:" N) h. K, |, T  d" X- F
mysql> create temporary table temp as select min(id) as MINID from student group by name;
, I0 M9 [7 K, Z6 m% O$ wQuery OK, 3 rows affected, k2 ?( N" p8 ]
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
% @9 T6 u: R7 a8 YQuery OK, 3 rows affected
mysql> select * from student;0 i9 x  l  `+ D8 F
+----+------+
5 r$ y  I- G' |9 L. ^  [| ID | NAME |
7 M1 ^9 a$ {/ G) Q+----+------+
: h4 P. z" u3 |- r" w+ v| 11 | aa |
$ `2 r  ~+ c+ y| 13 | bb |0 C" y7 [8 H. g. R: U
| 16 | cc |
# G& O2 m- s7 C* H/ n  d+----+------+3 L3 O: G* q% p  o* a) g  c6 \
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);% D' n3 m: P  I
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
+ b2 A/ n; |9 b原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。7 z* M8 q! E6 X* Q
怎么规避这个问题?
4 `5 e4 ^, l  N2 M! E' O4 A再加一层封装,如下:
' {0 V" P4 _# ymysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);* z- M* N/ q% _
Query OK, 3 rows affected
mysql> select * from student;
/ e# }& b, w: C/ B+----+------+) |+ o5 C, p/ Y( Q6 |$ f/ a
| ID | NAME |; H( b; p( W3 m  A6 Z" _' ?' t- H
+----+------+6 y3 P$ }# {- o: w+ x
| 11 | aa |
9 x6 z3 t; c7 L$ Y| 13 | bb |9 `& I$ N1 O; c3 [+ r) h. I
| 16 | cc |
; y( |1 K3 S, _$ B+----+------+5 C) ?# H' O. P- {2 s" o: k
3 rows in set
/ W& k4 l) c5 k& W8 N
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
0 i: X! S0 b  f0 ~: j% ^* f1 _, G* T4 w9 n* J3 y/ K5 ~' K

3 z# ]: a4 m" P7 }* `6 ~6 H4 w6 z
回复

使用道具 举报

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

本版积分规则

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