找回密码
 立即注册
查看: 2625|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:
: b9 }! O: P7 v8 D1、创建一个临时表,选取需要的数据。) _( h0 V; W# h( V3 ?1 i
2、清空原表。1 t. g5 y6 f4 S0 b. S4 S
3、临时表数据导入到原表。6 h$ q7 M. w+ N& O1 V+ B. h
4、删除临时表。
$ u, A! M! t4 c9 W: Q* \mysql> select * from student;3 H; {- K$ t* n& A7 |; K0 u$ v
+----+------+: A0 ]" E8 i( `" r
| ID | NAME |3 V8 n, r7 {6 b/ a
+----+------+: h* G2 S# ~9 F' M  z, O  n
| 11 | aa |
, a6 `) U& e* N5 y* i| 12 | aa |% V% ^5 N" N4 n
| 13 | bb |( n) t. q1 g  t6 T
| 14 | bb |5 C( N! D0 ~& V, ]. y
| 15 | bb |1 m& b' ?# ?) p8 g8 J, \6 F
| 16 | cc |
& ^$ e) T7 d, n6 D6 i4 x1 Q+----+------+
, T+ `& Q6 y9 e8 e2 N- R9 x* u6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
  K+ }7 r; N( x6 Z" l* v# n! k6 dQuery OK, 3 rows affected
: W  }3 J9 u/ `; cRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;: A9 D/ O' u4 l$ ~- I
Query OK, 0 rows affected
mysql> insert into student select * from temp;
) F. u: h" X/ @' W. d0 xQuery OK, 3 rows affected
) e: c( a1 E# b: ~Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
0 D$ J: L! J  e/ _! P1 i+----+------+2 o- V1 P) A& i9 h6 o
| ID | NAME |% D8 f3 ?( M9 s
+----+------+
+ d* s, a" C9 y6 T' l( R' e0 R- @| 11 | aa |
# \  q8 n9 _- \| 13 | bb |/ [" f( q% t+ B. \8 Q; F. r7 a
| 16 | cc |
/ U  U# n2 j4 n+----+------+( m6 P2 q1 y" _( H2 j' F6 @" \. C
3 rows in set
mysql> drop temporary table temp;
& }; q* D/ A; b; v: gQuery OK, 0 rows affected$ b1 x8 E& p; \
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
$ u3 i- o' T1 K+ hmysql> create temporary table temp as select min(id) as MINID from student group by name;4 ?( ^0 z% S( ?4 N, C* U2 s; m7 b* m
Query OK, 3 rows affected
9 G2 f  t# W& t" v: r  b- SRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);. O9 H9 t4 o) r
Query OK, 3 rows affected
mysql> select * from student;
* @7 b3 D; _' e1 W! ?) o( T. W; ~+----+------+
8 D0 {; h7 i- Q| ID | NAME |
/ M3 ]( J% J: r+----+------+, ?2 t, p) A. m1 d! b* v# a. u
| 11 | aa |2 [& @" t% t" j1 H
| 13 | bb |( m6 e2 ^7 m8 E8 w+ D% d) M
| 16 | cc |: u8 y$ R  b' e! g9 r- B
+----+------+
# B% M% N0 P  p; ^( f3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);" m/ z* i0 f$ Z7 h7 @: V4 a
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
, X1 ]; D9 R; z0 o: e原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
6 w, B0 I3 f) U怎么规避这个问题?% u$ V# i% \% B. q& U* n
再加一层封装,如下:$ n2 i4 m( j9 a% y( o# M
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);# o: T' R1 H# h0 p' w1 j8 z
Query OK, 3 rows affected
mysql> select * from student;5 e% W. M! w/ O
+----+------+  z! n0 [$ I! I3 K
| ID | NAME |+ i$ H# \1 t! D* E
+----+------+
3 `* |6 b$ w' y& Q| 11 | aa |5 U  e* m4 j& q9 y  c. Y! c
| 13 | bb |
3 {- O2 n0 K/ Z/ b| 16 | cc |
3 \/ x* R/ D+ v* y5 J+----+------+! x& w. K" \1 ~- I$ ~
3 rows in set
: e* V/ i8 s  _: b
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);- G/ b$ J$ r8 F2 R$ r  b; J
' u9 u# a  q- y; G

- S/ O# ~$ _) y1 |- j
回复

使用道具 举报

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

本版积分规则

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