面試題: mysql 數據庫去重
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 數據庫去重