mysql去重面试总结
2018-03-23 21:26
218 查看
mysql去重面试总结
前言:题目大概是这样的。。。建表:
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:
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)
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)
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)
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 )
胜负查询:
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', '负');
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
相关文章推荐
- python面试总结(五)内存管理与MYSQL引擎选择
- 11/1 面试总结-设置mysql 查询区分大小写
- 去BAT面试完的Mysql面试题总结(55道,带完整答案)
- 滴滴面试总结之MySQL存储引擎以及索引原理
- 【面试】【MySQL常见问题总结】【03】
- MySQL面试常见问题总结(MySQL5.5阅读总结)
- 【面试】【MySQL常见问题总结】【01】
- Java面试总结mysql
- 总结了一些MySQLDBA面试题目,欢迎大家补充。
- 招聘面试—关于Mysql的一点儿总结
- 【面试】【MySQL常见问题总结】【04】
- java笔试+面试总结——mysql
- 总结面经中常考的MYSQL面试问题(一)
- 【面试】【MySQL常见问题总结】【02】
- mysql优化简单总结面试用
- Mysql面试总结
- 东软实习生面试总结
- Hibernate面试知识点总结
- Mysql 自学小总结(精炼)
- 框架技术面试总结(高阶)