1. 程式人生 > >面試題: mysql 數據庫去重

面試題: mysql 數據庫去重

AI rds In line 面試總結 engine fault bsp row

mysql去重面試總結

前言:題目大概是這樣的。

建表:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE `test2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `peopleId` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of test2 -- ---------------------------- INSERT INTO `test2` VALUES (‘1‘, ‘1‘, ‘倒一‘); INSERT INTO `test2` VALUES (‘2‘, ‘1‘, ‘倒一‘); INSERT INTO `test2` VALUES (‘3‘, ‘3‘, ‘等等‘); INSERT INTO `test2` VALUES (‘4‘, ‘2‘, ‘421‘); INSERT INTO `test2` VALUES (‘5‘, ‘2‘, ‘421‘); INSERT INTO `test2`
VALUES (‘6‘, ‘2‘, ‘421‘);

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

網上答案:select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1)

mysql:select * from test2 where id in (select id from test2 group by peopleId having count(peopleId) > 1)

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

網上答案:DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1);

mysql:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 DELETE FROM test2 WHERE peopleId IN ( select a.peopleId FROM ( SELECT * FROM test2 GROUP BY peopleId HAVING count(peopleId) > 1 )a ) AND id NOT IN ( select b.id FROM ( SELECT * FROM test2 GROUP BY name HAVING count(name) > 1 )b )

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

select * from 表 a where (a.Id,a.seq) in(select Id,seq from 表 group by Id,seq having count(*) > 1)

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT * FROM test3 a WHERE (a.id, a.seq) IN ( SELECT id, seq FROM test3 GROUP BY id, seq HAVING count(*) > 1 )

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

delete from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count() > 1) and rowid not in (select min(rowid) from 表 group by Id,seq 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 DELETE FROM test3 WHERE (id, seq) IN ( SELECT a.id, a.seq FROM ( SELECT id, seq FROM test3 GROUP BY id, seq HAVING count(*) > 1 ) a ) AND (id, seq, `name`) NOT IN ( SELECT b.* FROM ( SELECT * FROM test3 GROUP BY id, seq HAVING count(*) > 1 ) b )

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

select * from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count() > 1) and rowid not in (select min(rowid) from 表 group by Id,seq 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 select * FROM test3 WHERE (id, seq) IN ( SELECT a.id, a.seq FROM ( SELECT id, seq FROM test3 GROUP BY id, seq HAVING count(*) > 1 ) a ) AND (id, seq, `name`) NOT IN ( SELECT b.* FROM ( SELECT * FROM test3 GROUP BY id, seq HAVING count(*) > 1 ) b )

勝負查詢:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE `t_game` ( `game_date` varchar(255) DEFAULT NULL, `game_res` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_game -- ---------------------------- INSERT INTO `t_game` VALUES (‘2018-03-20‘, ‘勝‘); INSERT INTO `t_game` VALUES (‘2018-03-20‘, ‘勝‘); INSERT INTO `t_game` VALUES (‘2018-03-20‘, ‘負‘); INSERT INTO `t_game` VALUES (‘2018-03-21‘, ‘負‘); INSERT INTO `t_game` VALUES (‘2018-03-21‘, ‘勝‘); INSERT INTO `t_game` VALUES (‘2018-03-21‘, ‘負‘);
?
1 2 3 select game_date,(select count(*) from t_game where game_date = t.game_date and game_res = ‘勝‘) as ‘勝‘ ,(select count(*) from t_game where game_date = t.game_date and game_res = ‘負‘) as ‘負‘ from t_game as t group by game_date;

總結

1、delete不能有別名

2、mysql不支持又查又改,要用臨時表

3、mysql不支持rowid

面試題: mysql 數據庫去重