码迷,mamicode.com
首页 > 数据库 > 详细

删除特定影响因素(字段列)下的重复记录(MySQL)

时间:2015-07-23 21:11:24      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

;CREATE TABLE TabTest
(
    `id` INT(11) NOT NULL AUTO_INCREMENT     
    ,`factorA` VARCHAR(255) NOT NULL DEFAULT  
    ,`factorB` VARCHAR(255) NOT NULL DEFAULT  
    ,`factorC` DECIMAL(10,2) NOT NULL DEFAULT 0
    ,`remark` VARCHAR(255) NOT NULL DEFAULT  
    , PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT=‘‘;

INSERT INTO TabTest(factorA, factorB, factorC, remark)
SELECT A1, B1, 0.5, 1..
UNION ALL SELECT A1, B1, 0.5, 2..
UNION ALL SELECT A2, B2, 0.5, 3..
UNION ALL SELECT A2, B2, 1.5, 4..
UNION ALL SELECT A2, B2, 0.5, 5..

;SELECT * FROM TabTest;

技术分享

-- 方案一
;DELETE FROM TabTest WHERE id NOT IN ( SELECT * FROM ( SELECT id FROM TabTest GROUP BY factorA, factorB, factorC ) b );
-- 方案二
DELETE FROM TabTest WHERE id IN 
(
    -- MySQL Error 1093 – Can‘t specify target table for update in FROM clause
    SELECT b.id FROM 
    (
        SELECT tOuter.`id` FROM TabTest tOuter 
        INNER JOIN 
        (
            SELECT tInner.id, tInner.factorA, tInner.factorB, tInner.factorC
            FROM TabTest tInner
            GROUP BY tInner.factorA, tInner.factorB, tInner.factorC
            HAVING COUNT(1) > 1
        ) a
        ON tOuter.`factorA` = a.`factorA`
        AND tOuter.`factorB` = a.`factorB`
        AND tOuter.`factorC` = a.`factorC`
        WHERE tOuter.`id` <> a.`id`
    )b
)

技术分享

方案一: 数据量小时, 比较便捷

方案二: 数据量大时使用, 第一个方案在70万数据下试过, 5分钟出不来结果, 放弃, 使用第二种方案, 秒完.

删除特定影响因素(字段列)下的重复记录(MySQL)

标签:

原文地址:http://www.cnblogs.com/know-life-death/p/4671532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!