mysql查詢表裏的重複數據方法

1

2

3

4

INSERT INTO hk_test(username, passwd) VALUES

('qmf1', 'qmf1'),('qmf2', 'qmf11')

  

delete from hk_test where username='qmf1' and passwd='qmf1'

 

 

MySQL裏查詢表裏的重複數據記錄:

先查看重複的原始數據:

 

場景一:列出username字段有重讀的數據

?

1

2

3

select username,count(*) as count from hk_test group by username having count>1;

  

SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC;

 

 

這種方法只是統計了該字段重複對應的具體的個數

場景二:列出username字段重複記錄的具體指:

?

1

2

3

4

5

select * from hk_test where username in (select username from hk_test group by username having count(username) > 1)

  

SELECT username,passwd FROM hk_test WHERE username in ( SELECT username FROM hk_test GROUP BY username HAVING count(username)>1)

  

但是這條語句在mysql中效率太差,感覺mysql並沒有爲子查詢生成臨時表。在數據量大的時候,耗時很長時間

 

 

解決方法:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

於是使用先建立臨時表

  

create table `tmptable` as (

SELECT `name`

FROM `table`

GROUP BY `name` HAVING count(`name`) >1

);

  

然後使用多表連接查詢

  

SELECT a.`id`, a.`name`

FROM `table` a, `tmptable` t

WHERE a.`name` = t.`name`;

  

結果這次結果很快就出來了。

  

distinct去重複

  

SELECT distinct a.`id`, a.`name`

FROM `table` a, `tmptable` t

WHERE a.`name` = t.`name`;

場景三:查看兩個字段都重複的記錄:比如username和passwd兩個字段都有重複的記錄:

?

1

2

select * from hk_test a

where (a.username,a.passwd) in (select username,passwd from hk_test group by username,passwd having count(*) > 1)

 

 

場景四:查詢表中多個字段同時重複的記錄: 

1

select username,passwd,count(*) from hk_test group by username,passwd having count(*) > 1

 

 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

MySQL查詢表內重複記錄

  

查詢及刪除重複記錄的方法

(一)

1、查找表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷

select *

from people

where peopleId in (select peopleId from people group by peopleId having count(peopleId)>1)

  

2、刪除表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷,只留有一個記錄

delete from people

where peopleId in (select peopleId

from people group by peopleId having count(peopleId)>1)

and min(id) not

in (select id from people group by peopleId having count(peopleId)>1)

  

3、查找表中多餘的重複記錄(多個字段)

select * from vitae a

where (a.peopleId,a.seq) in

(select peopleId,seq from vitae group by peopleId,seq having count(*)>1)

  

4、刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄

delete from vitae a

where

(a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq

having count(*) > 1)

and rowid not in (select min(rowid) from vitae group

by peopleId,seq having count(*)>1)

  

5、查找表中多餘的重複記錄(多個字段),不包含rowid最小的記錄

select * from vitae a

where

(a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq

having count(*) > 1)

and rowid not in (select min(rowid) from vitae group

by peopleId,seq having count(*)>1)

  

(二)

比方說

在A表中存在一個字段“name”,而且不同記錄之間的“name”值有可能會相同,現在就是需要查詢出在該表中的各記錄之間,“name”值存在重複的項;

Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果還查性別也相同大則如下:

Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

  

(三)

方法一

declare @max integer,@id integer

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段

having count(*) >; 1

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

delete from 表名 where 主字段 = @id

fetch cur_rows into @id,@max

end

close cur_rows

set rowcount 0

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

SELECT * from tab1 where CompanyName in( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT(*)>1);

-- 129.433ms

  

SELECT * from tab1 INNER join ( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT(*)>1) as tab2 USING(CompanyName);

-- 0.482ms

  

方法二

  

  有兩個意義上的重複記錄,一是完全重複的記錄,也即所有字段均重複的記錄,二是部分關鍵字段重複的記錄,比如Name字段重複,而其他字段不一定重複或都重複可以忽略。

  

  1、對於第一種重複,比較容易解決,使用

  

select distinct * from tableName

  

  就可以得到無重複記錄的結果集。

  

  如果該表需要刪除重複的記錄(重複記錄保留1條),可以按以下方法刪除

  

select distinct * into #Tmp from tableName

  

drop table tableName

  

select * into tableName from #Tmp

  

drop table #Tmp

  

  發生這種重複的原因是表設計不周產生的,增加唯一索引列即可解決。

  

2、這類重複問題通常要求保留重複記錄中的第一條記錄,操作方法如下

  

  假設有重複的字段爲Name,Address,要求得到這兩個字段唯一的結果集

  

select identity(int,1,1) as autoID, * into #Tmp from tableName

  

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

  

select * from #Tmp where autoID in(select autoID from #tmp2)

  

最後一個select即得到了Name,Address不重複的結果集(但多了一個autoID字段,實際寫時可以寫在select子句中省去此列)

  

(四)查詢重複

  

select * from tablename where id in (

  

select id from tablename group by id having count(id) > 1)

 

常用的語句

  

1、查找表中多餘的重複記錄,重複記錄是根據單個字段(mail_id)來判斷

  

 代碼如下 複製代碼

 SELECT * FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1);

  

  

2、刪除表中多餘的重複記錄,重複記錄是根據單個字段(mail_id)來判斷,只留有rowid最小的記錄

  

 代碼如下 複製代碼

DELETE FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id HAVING COUNT(mail_id )>1);

  

  

3、查找表中多餘的重複記錄(多個字段)

  

 代碼如下 複製代碼

SELECT * FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1);

  

  

4、刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄

  

 代碼如下 複製代碼

 DELETE FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COU(www.jb51.net)NT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1);

  

  

5、查找表中多餘的重複記錄(多個字段),不包含rowid最小的記錄

  

 代碼如下 複製代碼

SELECT * FROM table WHERE (a.mail_id,a.phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1);

  

  

存儲過程

  

declare @max integer,@id integer

  

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1

  

open cur_rows

  

fetch cur_rows into @id,@max

  

while @@fetch_status=0

  

begin

  

select @max = @max -1

  

set rowcount @max

  

delete from 表名 where 主字段 = @id

  

fetch cur_rows into @id,@max

  

end

  

close cur_rows

  

set rowcount 0

  

  

  

(一)單個字段

  

1、查找表中多餘的重複記錄,根據(question_title)字段來判斷

  

 代碼如下 複製代碼

select * from questions where question_title in (select question_title from people group by question_title having count(question_title) > 1)

  

  

2、刪除表中多餘的重複記錄,根據(question_title)字段來判斷,只留有一個記錄

  

 代碼如下 複製代碼

delete from questions

where peopleId in (select peopleId from people group by peopleId having count(question_title) > 1)

and min(id) not in (select question_id from questions group by question_title having count(question_title)>1)

  

(二)多個字段

  

刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄

  

 代碼如下 複製代碼

DELETE FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM que(www.jb51.net)stions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1)

  

  

用上述語句無法刪除,創建了臨時表才刪的,求各位達人解釋一下。

  

 代碼如下 複製代碼

CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1);

  

DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp);

  

DROP TABLE tmp;

查找mysql數據表中重複記錄
mysql數據庫中的數據越來越多,當然排除不了重複的數據,在維護數據的時候突然想到要把多餘的數據給刪減掉,剩下有價值的數據。

以下sql語句可以實現查找出一個表中的所有重複的記錄.
select user_name,count(*) as count from user_table group by user_name having count>1;

參數說明:

user_name爲要查找的重複字段.

count用來判斷大於一的纔是重複的.

user_table爲要查找的表名.

group by用來分組

having用來過濾.

把參數換成自己數據表的相應字段參數,可以先在Phpmyadmin裏面或者Navicat裏面去運行,看看有哪些數據重複了,然後在數據庫裏面刪除掉,也可以直接將SQL語句放到後臺讀取新聞的頁面裏面讀取出來,完善成查詢重複數據的列表,有重複的可以直接刪除。

效果如下:

 

缺點:這種方法的缺點就是當你的數據庫裏面的數據量很大的時候,效率很低,我用的是Navicat測試的,數據量不大,效率很高,當然,網站還有其它查詢數據重複的SQL語句,舉一反三,大家好好研究研究,找到一個適合自己網站的查詢語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章