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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
1 D6 c& S& l% @( Q" i) q! H1、创建一个临时表,选取需要的数据。2 n* t1 A! _5 A9 G
2、清空原表。
) @7 o: g  t: I8 h3、临时表数据导入到原表。5 E% E0 x" V$ E* Z, R3 q
4、删除临时表。
. U3 @/ a) v) q" d, F& imysql> select * from student;
5 S2 t5 W. N+ {/ T5 A6 m' D  K# N+----+------+
* W3 ^/ n, Q& F" `; |* F| ID | NAME |  {0 ^, ~" }' ~/ ~  E
+----+------+! y5 u1 V2 `- c6 D. _
| 11 | aa |
0 H* \4 D3 I7 }- C# q+ t! S| 12 | aa |/ f2 w! D2 V% b
| 13 | bb |
- e  z' A6 c4 `% G) V( r: v| 14 | bb |
2 t+ i! r9 m9 T0 j| 15 | bb |* m( B6 m  r$ D
| 16 | cc |% Z4 M' M7 {; X( y) u$ I
+----+------+
* U/ C& U7 I' u# F5 T: W7 y# U6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;; l/ d) Y3 Y4 P
Query OK, 3 rows affected
+ n. m: R4 F* ?* n" j/ z3 TRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;1 D3 L# Z( U# {" q
Query OK, 0 rows affected
mysql> insert into student select * from temp;/ G4 ?" y* h  ~5 Q, U% ~5 Q
Query OK, 3 rows affected1 h$ S7 u: Q# ]2 o! @
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
$ K: p/ r6 M0 i& r$ L3 x( |+----+------+
* A- j, Z/ u/ P" w| ID | NAME |3 C# a4 k6 m; a3 o/ y5 f
+----+------+
. G: D* Q4 s1 J) }! L| 11 | aa |
6 I; U+ s9 k/ ?7 s8 E& H1 }| 13 | bb |
( X: p4 n' x+ Z. I| 16 | cc |
- D: p) p6 e0 d3 T' l; C0 c, O  _+----+------++ r1 |) l6 d* w% k1 x; p; H/ k4 D' w
3 rows in set
mysql> drop temporary table temp;+ [/ g; h" |% p/ R* f" u
Query OK, 0 rows affected
. q5 G. Q4 R/ Q/ D这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:! n% n+ a1 R, C9 \1 p- R- Z
mysql> create temporary table temp as select min(id) as MINID from student group by name;
# S& t7 @# ~1 e. k: X0 S  a! DQuery OK, 3 rows affected
" \+ N) V$ ?; l$ O" lRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
, H$ q$ H1 |+ a' j+ [' C0 E. N: bQuery OK, 3 rows affected
mysql> select * from student;
" B4 j" a; S6 [9 D5 a7 S& ?+----+------+) z8 M- t/ X+ j& }1 h* T
| ID | NAME |
! h' Z! P1 x  O: N- O2 I. p+----+------+
  f. h$ M  }5 G/ p+ d| 11 | aa |8 m0 {/ b" V7 ?* r* P+ v) j7 Y
| 13 | bb |
, m% Z0 N/ S" Z; E( c5 Z9 U| 16 | cc |) ^7 T- \( L) S: W0 p
+----+------+# J& I! [3 u- P) _6 P
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);: B' O* N! }- I7 e- S7 C  l
执行报错:1093 - You can't specify target table 'student' for update in FROM clause+ T9 `  ]% G1 [) V* c4 v$ ^
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
* J1 O1 m5 A. E2 V  a怎么规避这个问题?1 `" r* u5 T- n( t  h
再加一层封装,如下:+ ?" S" T3 S4 ?2 M7 F# b, ~/ P
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);
2 Q% B& o' B" y9 d5 dQuery OK, 3 rows affected
mysql> select * from student;
4 C7 d" `: M  L0 I9 e- x6 j* I+----+------+& \: K9 I7 |3 f6 Q( {
| ID | NAME |) O7 j! g, s5 i1 ~4 M, k
+----+------++ ~2 S' z' O9 o+ G- J/ t+ b6 I
| 11 | aa |
8 u' B9 l+ I8 ~/ \| 13 | bb |7 t) t$ p9 S( y  u. X" f. s; r
| 16 | cc |9 I, i6 B% o4 [0 ~" N" `: y5 p+ |
+----+------+
, i0 j+ l' X0 ~$ `6 r2 R3 rows in set
9 j: x4 ]  X% [! p9 h
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
9 B# \3 s- w( ]. U* _+ C" U) K/ L' r% F; ]

8 h0 b7 p$ h2 a! E6 @
回复

使用道具 举报

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

本版积分规则

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