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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:: L. V. I2 _  u  a; d2 d. K0 F
1、创建一个临时表,选取需要的数据。( Z/ w! L2 ]$ \. k
2、清空原表。) ?2 D4 K- r8 {: q4 |9 Z* U! t, z
3、临时表数据导入到原表。
+ U% K4 r7 @8 J* [$ @  J4、删除临时表。
$ g. L4 w% S, ~. m8 Omysql> select * from student;
2 i1 \, o% c/ h& B+----+------+
3 I% E) s6 k+ ]% S' [| ID | NAME |4 c5 y' H* H5 T: o/ J, n
+----+------+. ~8 J6 n: I* O. h1 Z6 \! _$ P% \
| 11 | aa |
& j, F, j7 }9 P: `| 12 | aa |8 v% [% b: s" X5 m; K
| 13 | bb |
, _! D5 X( @( m7 D* o/ || 14 | bb |& W% |: Z7 E/ J) v3 Q7 t8 a
| 15 | bb |+ Y8 m: D4 ^5 k+ w+ a. G8 w2 M: o3 P
| 16 | cc |
$ }+ Y5 t9 C9 H6 h- J" H3 `+----+------+
" g+ L- X  V% r6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
! K8 z, b; r& o3 N. XQuery OK, 3 rows affected3 w; r! E- A2 \' V, x5 u
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;0 b. Q" Q1 I/ e  o( K0 e# E& _
Query OK, 0 rows affected
mysql> insert into student select * from temp;. o  Q8 `4 y6 p/ O; f, H
Query OK, 3 rows affected
* ^& l% f% R9 |9 KRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
" m) J0 R  W7 a7 Y# Q0 f* G+----+------+
: g: D9 i. \1 R1 k| ID | NAME |
) B+ R0 o6 @( L+----+------+
7 `; U& ~1 p. K$ v9 q| 11 | aa |
( j1 W5 G1 c  R5 {7 w/ U| 13 | bb |
+ O$ c* N3 y% a. V4 u; |& r| 16 | cc |
0 x) @7 A: p  H0 c' F! F! ]: m+----+------+
8 c& X1 u  {7 S' V2 S7 n3 rows in set
mysql> drop temporary table temp;
4 \. k& q' R4 u6 e4 xQuery OK, 0 rows affected# W+ E$ H9 S/ F
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:, x+ W  p9 [/ g& [
mysql> create temporary table temp as select min(id) as MINID from student group by name;& @& {$ b! O6 Q/ {
Query OK, 3 rows affected$ A& h) I" I. w0 F, R5 p; y
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
3 p& l. h: H" QQuery OK, 3 rows affected
mysql> select * from student;
; Y1 r& U3 j% i, s) _+ s4 r+----+------+
0 L! k9 O0 x! ~% R2 f& j: d6 Y" }| ID | NAME |7 \1 V8 @9 {9 _1 C' x
+----+------+
$ `+ }" I, e9 P% d, Q& b| 11 | aa |: O3 l8 e: A6 u, `1 r2 o' {- K2 T
| 13 | bb |
4 r1 N5 ~' ?+ k6 I3 H| 16 | cc |$ q0 q% @. c  E" E5 h6 B  w" A, R
+----+------+( U5 n& H/ i  e( B
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
7 H5 }% u, U2 [$ \& N2 z执行报错:1093 - You can't specify target table 'student' for update in FROM clause
: U9 l  s0 ~: t" _1 U: c2 q原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。9 [7 w8 q! v8 r, X# R9 e! w, V
怎么规避这个问题?
) z( d9 @3 ~$ p再加一层封装,如下:2 B" B& [+ n9 t5 ?
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);; I2 R) \, }' p: ?! t$ w5 x. v& D
Query OK, 3 rows affected
mysql> select * from student;' K7 X2 T7 U+ u
+----+------+$ S+ \, X2 f) e' H! Y$ V
| ID | NAME |0 [  a8 Y* W: z2 b) L4 l( Z  I7 e
+----+------+9 z. I. n1 H0 Y
| 11 | aa |, _3 x4 X9 A$ A
| 13 | bb |6 B& O3 o& I, G6 j
| 16 | cc |; w, [- E% u- A. ]3 P9 M, X
+----+------+
2 N( e9 M7 {( o0 E- f: e4 c- m3 rows in set

# y- j1 p' V9 g6 Y方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
' c& ~# l' Z* n- l  S5 C
2 w# W' c7 n9 ^# r4 L6 [6 o  W1 a* T
回复

使用道具 举报

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

本版积分规则

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