zoukankan      html  css  js  c++  java
  • 重复记录(duplicate records)相关运营数据

    • 创建表和測试数据

    /* 表结构 */
    DROPTABLEIFEXISTS `t1`;
    CREATETABLEIFNOTEXISTS `t1`(
    `id`
    INT(1)NOTNULL AUTO_INCREMENT,
    `name`
    VARCHAR(20)NOTNULL,
    `
    add`VARCHAR(20)NOTNULL,
    PRIMARYKEY(`id`)
    )Engine
    =InnoDB;

    /* 插入測试数据 */
    INSERTINTO `t1`(`name`,`add`)VALUES
    (
    'abc',"123"),
    (
    'abc',"123"),
    (
    'abc',"321"),
    (
    'abc',"123"),
    (
    'xzy',"123"),
    (
    'xzy',"456"),
    (
    'xzy',"456"),
    (
    'xzy',"456"),
    (
    'xzy',"789"),
    (
    'xzy',"987"),
    (
    'xzy',"789"),
    (
    'ijk',"147"),
    (
    'ijk',"147"),
    (
    'ijk',"852"),
    (
    'opq',"852"),
    (
    'opq',"963"),
    (
    'opq',"741"),
    (
    'tpk',"741"),
    (
    'tpk',"963"),
    (
    'tpk',"963"),
    (
    'wer',"546"),
    (
    'wer',"546"),
    (
    'once',"546");

    执行完上面的SQL,能够用
    SELECT*FROM `t1` 測试一下。



    • 查找全部反复的数据

    反复数据仅仅显示当中一条:

    /* 查找全部反复数据,反复数据仅仅显示一次 */
    SELECT 
        * 
    FROM
        `t1` 
    GROUP BY `name` 
    HAVING COUNT(1) > 1 
    #HAVING COUNT(1) = 1 #这条语句表示显示当中不反复的数据

    效果例如以下:
        id  name    add     
    ------  ------  --------
         1  abc     123     
        12  ijk     147     
        15  opq     852     
        18  tpk     741     
        21  wer     546     
         5  xzy     123     


    反复数据每条都显示

    /* 查找全部反复数据(反复数据反复显示 */
    SELECT 
        t1.* 
    FROM
        t1,
        (SELECT 
            t1.name,
            t1.add 
        FROM
            t1 
        GROUP BY `name`,
            `add` 
        HAVING COUNT(1) > 1) AS `t2` 
    WHERE `t1`.`name` = `t2`.`name` 
        AND `t1`.`add` = `t2`.`add` 


    查询结果例如以下:


        id  name    add     
    ------  ------  --------
         1  abc     123     
         2  abc     123     
         4  abc     123     
         6  xzy     456     
         7  xzy     456     
         8  xzy     456     
         9  xzy     789     
        11  xzy     789     
        12  ijk     147     
        13  ijk     147     
        19  tpk     963     
        20  tpk     963     
        21  wer     546     
        22  wer     546     

    • 显示全部数据(反复数据仅仅显示一次)

    以下的SQL简单高速有效,但不能保证反复字段的records显示哪一个record。

    SELECT 
    
        * 
    
    FROM
    
        t1 
    
    GROUP BY NAME 
    
    #having count(*) > 1 #加上这条语句,反复字段的records仅仅显示一次


    • 删除反复数据:

    1 最简单高速 的方法:

    1. 新建一个一样表结构的表,经反复内容字段设置为unique

    2. 然后运行语句:INSERT IGNORE INTO new_table SELECT * FROM old_table

    对于本题就是:

    1. 新建t1_copy,然后将name。add设置为主键

    2.运行INSERT IGNORE INTO t1_copy SELECT * FROM t1 ORDER BY t1.`id`。 OK


    2 笨方法UNION(数据量大时非常慢):

    SELECT 
        * 
    FROM
        t1 
    GROUP BY `name`,
        `add` 
    HAVING COUNT(1) > 1 
    UNION
    SELECT 
        * 
    FROM
        t1 
    GROUP BY `name`,
        `add` 
    HAVING COUNT(1) = 1 
    ORDER BY id 



    注意:

    这里表中有一个主键id。若没有主键id。数据量大时会非常慢。这样能够人为插入一个主键id。如

    參考文章:


    转载请注明出处:http://blog.csdn.net/acema/article/details/37692867


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    du熊学斐波那契I
    《博客园精华集》分类索引
    C++中指针和引用的区别
    堆和栈的区别
    getch和getchar的区别
    class和struct
    ARM开发步骤
    ARM寻址方式
    存储器映射
    思维中的错误
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4910293.html
Copyright © 2011-2022 走看看