mysql 去重



-- 查找表中多余的重复记录(多个字段)

SELECT * FROM tb_news1 a
WHERE (a.Id,a.TITLE,a.SOURCE,a.DATE) IN
(SELECT a.Id,a.TITLE,a.SOURCE,a.DATE FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1) > 1)


-- 删除表中多余的重复记录(多个字段),只留有rowid最小的记录
DELETE FROM tb_news1 a WHERE
(a.Id,a.TITLE,a.SOURCE,a.DATE) IN
(SELECT a.Id,a.TITLE,a.SOURCE,a.DATE FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1) > 1)

AND a.Id NOT IN (SELECT MIN(a.Id) FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1)>1 )



-- ================ test data ======================
DROP TABLE IF EXISTS tb_news1;
CREATE TABLE tb_news1 (
Id INT(11) NOT NULL ,
TITLE VARCHAR(255) DEFAULT NULL COMMENT '标题',
CONTENT VARCHAR(1000) DEFAULT NULL COMMENT '内容',
SOURCE VARCHAR(255) DEFAULT NULL COMMENT '新闻来源',
DATE DATETIME DEFAULT NULL COMMENT '新闻日期'
-- ,
-- PRIMARY KEY (Id)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO tb_news1 VALUES (1,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (2,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (3,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
INSERT INTO tb_news VALUES (4,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (5,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
INSERT INTO tb_news1 VALUES (6,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
--
INSERT INTO tb_news1 VALUES (1,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news1 VALUES (6,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');


SELECT * FROM tb_news1;

-- =================================


-- ---
1。用rowid方法
据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:

查数据:
SELECT * FROM table1 a WHERE rowid !=(SELECT MAX(rowid)
FROM table1 b WHERE a.name1=b.name1 AND a.name2=b.name2……)

删数据:
DELETE FROM table1 a WHERE rowid !=(SELECT MAX(rowid)
FROM table1 b WHERE a.name1=b.name1 AND a.name2=b.name2……)

2.group BY方法

查数据:
SELECT COUNT(num), MAX(NAME) FROM student --列出重复的记录数,并列出他的NAME属性
GROUP BY num
HAVING COUNT(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
删数据:
DELETE FROM student
GROUP BY num
HAVING COUNT(num) >1
这样的话就把所有重复的都删除了。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值