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 数据库去重 已看1 不好使的更多相关文章

  1. MySQL数据库去重 SQL解决

    MySQL数据库去重的方法 ​ 数据库最近有很多重复的数据,数据量还有点大,本想着用代码解决,后来发现用SQL就能解决,这里记录一下 看这条SQL DELETE consum_record FROM ...

  2. 面试题: mysql数据库 已看1 索引和事务 没用

    mysql数据库面试总结 2017年09月04日 00:11:40 阅读数:151 结合网上大神还有自己面试经历,收集的总结Mysql面试题,方便自己准备面试: mysql一个永远都复习不完,尽量总结 ...

  3. 面试题: mysql数据库 已看1 简单的sql练习

    数据库总结--MySQL常见面试题 2015年03月24日 17:56:06 阅读数:7787 1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee ord ...

  4. 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化

    总结的一些MySQL数据库面试题 2016年06月16日 11:41:18 阅读数:4950 一.sql语句应该考虑哪些安全性? (1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语 ...

  5. 面试题: java面试经历 已看1 抢红包如何分配每个人抢到的钱 有用 难点的面试题

    2018.03.09 深圳乐唯科技 我看了下感觉这公司貌似挺不错的,面试官人也挺好的,氛围应该很不错,可惜我实力不足,唉,接续努力,下面把面试中印象较深的三个问题写一下. 面试问题1:数据库删除重复数 ...

  6. mysql数据库去重语句和不同表之间列的复制语句

    1.去重语句:DELETE FROM `v_klg_item` WHERE id NOT IN (SELECT * FROM (SELECT MAX(id) FROM `v_klg_item` GRO ...

  7. 某硕笔试题mysql数据库部分(较为全面)

    Student(S#,Sname,Sage,Ssex) 学生表  Course(C#,Cname,T#) 课程表  SC(S#,C#,score) 成绩表  Teacher(T#,Tname) 教师表 ...

  8. MySQL数据库安装,配置My.ini文件

    最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySql所以在配置的时候出现了一些问题,该篇 ...

  9. linux操作mysql数据库常用简单步骤

    连接mysql数据库: 主要看mysql安装在哪一个目录下: mysql -h主机地址 -u用户名 -p用户密码   或者mysql -h ip地址 -u  zaiai -p zaiai   或者/v ...

随机推荐

  1. HDU - 5695 Gym Class 【拓扑排序】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5695 思路 给定一些关系 进行拓扑排序 但是有一个要求 对于哪些没有确切的位置的点 要按照ID大小 I ...

  2. Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

    Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...

  3. python3 内置常用函数系列一

    python3 内置了一系列的常用函数, python英文官方文档详细说明:点击查看, 为了方便查看,将内置常用的函数的记录一下来. Python3版本所有的内置函数: 1.abs() print(a ...

  4. JavaScript的Function 类型

    一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...

  5. codeforces 466C 计数 codeforces 483B 二分 容斥

    题意:给你n个数,将他们分成连续的三个部分使得每个部分的和相同,求出分法的种数. 思路:用一个数组a[i]记下从第一个点到当前i点的总和.最后一个点是总和为sum的点,只需求出总和为1/3sum的点和 ...

  6. 剑指offer之 旋转数组的最小数字

    package Problem8; public class MinInReversingList { /* * 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. * 输入 ...

  7. Nginix安装教程(Ubuntu)

    安装gcc g++的依赖库 #apt-get install build-essential #apt-get install libtool   安装 pcre依赖库 #sudo apt-get u ...

  8. 洛谷p3369 treap

    这是一个treap裸题,还可以用splay,替罪羊树,线段树等等写 treap是树和堆结合,可以方便的在O(log(n))期望时间内进行以下操作,因此treap又叫做名次树 插入x数 删除x数(若有多 ...

  9. c#基础综述

    一个相关的博客:http://blog.csdn.net/zhang_xinxiu/article/details/8605980 很好的一个网站:http://www.runoob.com/

  10. png8 png24 png32

    解释 PNG8 : 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明.索引透明.alpha透明. PNG24 : 支持2的24次方种颜色,表现为不透明.PS导出PNG24是会根据 ...