中国网络渗透测试联盟
标题: mysql删除重复记录,保存Id最小的一条 [打印本页]
作者: admin 时间: 2016-8-23 20:58
标题: mysql删除重复记录,保存Id最小的一条
方法1:4 B& H4 [3 h. X! D. Y1 ~
1、创建一个临时表,选取需要的数据。0 @$ b0 s% m1 R8 X# {& |6 g3 T
2、清空原表。
& D' N0 f% |* A4 c3、临时表数据导入到原表。- i& L' G0 C$ z
4、删除临时表。
3 [7 h6 r* ^* _: s1 Rmysql> select * from student;
! q% C) E8 p* x) b7 w+----+------+
( F) K, {% W7 Y. |3 [| ID | NAME |
4 l# c- Z+ t) {& p# f+----+------+
7 F* s- b$ m6 ]1 i/ m| 11 | aa |
* k1 ]7 C2 O* k6 D3 P| 12 | aa |7 n# R6 t+ R/ _- L2 z0 l
| 13 | bb |0 z1 F4 ?% s9 N' A
| 14 | bb |
4 K( F( J; m* A `9 B5 b| 15 | bb |
' {' w7 c. s# ?1 l8 z1 |9 n* L8 _| 16 | cc |
0 _' \, p+ k! W/ h/ |7 V" r2 ^1 f+----+------+3 d$ P9 O" D4 S/ Q( B( X p
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
% m4 W9 f( E" nQuery OK, 3 rows affected/ Y3 R9 e+ J% |' ~5 b
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;* S) K; r3 d" L6 \9 }8 x
Query OK, 0 rows affected
mysql> insert into student select * from temp;
/ L5 b( R \ b- D+ ?/ l' h' Y% sQuery OK, 3 rows affected
3 H+ ]" {: r, F. h4 p0 GRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
. N( }5 a) D, l0 w( u4 L0 B* L0 [+----+------+
; s7 N, S( S1 K: ^$ || ID | NAME |% s1 c) C ~5 S( S. q& ?( E
+----+------+
/ I3 _5 d, V6 x6 A) U9 R| 11 | aa |
. H: ?0 ~( a3 J) g& ~| 13 | bb |
9 o' C$ v8 Q6 N/ N- B| 16 | cc |, m" |, [6 b; X. L$ G. u
+----+------+9 j$ p# `) r5 `- D0 N* O6 p% v
3 rows in set
mysql> drop temporary table temp;2 T0 ]! k: X# V! J* R% p5 J
Query OK, 0 rows affected1 }, L+ d/ Z# }. ?4 e$ N6 C# C
这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
& j& B9 {* B/ x/ ~ P6 B! R8 Mmysql> create temporary table temp as select min(id) as MINID from student group by name;) E! c" n8 H+ D$ C1 r" t! u
Query OK, 3 rows affected- k( {, Q. f3 r/ w. l( P4 l8 A9 w
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
z! M0 L5 Y: f4 H* s$ s1 A! iQuery OK, 3 rows affected
mysql> select * from student;. R' p2 _- J3 j/ ~7 i
+----+------+
( a! `! l) v) N& U' Q| ID | NAME |
6 i5 \! p$ @, j7 j1 x+----+------+
4 Z/ a; X' E) F4 \| 11 | aa |. c. w5 b! {' B6 I
| 13 | bb |
7 I# ~6 @7 @: D5 v8 v- j J| 16 | cc |, N, @6 ~) h4 Z( {6 m1 t
+----+------+
& Z6 x' |; `3 c) r# J3 b3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
9 Y7 n6 ^5 H) ]执行报错:1093 - You can't specify target table 'student' for update in FROM clause
* H" \, g9 s7 y) y原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。/ ^4 s# E( G3 J+ b' K* k
怎么规避这个问题?/ G; O+ l* Q1 W* K4 ^& N4 z& C
再加一层封装,如下:( `$ q/ G$ C& r, {7 ^
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);5 Y+ L" a; {5 `1 S+ ]4 |; H
Query OK, 3 rows affected
mysql> select * from student;
$ a( p- r0 `+ Q: Y$ b+----+------+: x Q/ S! e7 p/ Q* T: R& A, ]) {4 P
| ID | NAME |
* X8 s8 y4 ?9 j# A; l* n: e+----+------+
4 e! i/ T, Z5 m0 Y# x| 11 | aa |
* [2 G; ~& C( z( i. A% s# a| 13 | bb |2 K1 q3 u0 `5 Z. e9 ~ z4 ?$ n
| 16 | cc |
4 K* ?/ R, T& c; Q& Z5 ]* @+----+------+) O' w8 K7 s1 d
3 rows in set
' ]* i* s; ^1 G2 a* T4 `5 }2 I) |
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
7 g, R" z; `) B$ q5 X) v
5 [3 z0 ?* e" h9 v9 ]( x9 P6 ?0 {7 V8 S4 }$ D9 u; K( |' a
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) |
Powered by Discuz! X3.2 |