我有类似下面的重复结果,其中某些列可能包含数据,但可能不是
| contact_info | icon | id | title | lastmodified_by |
+--------------+------+-----+---------------+------------------+
| 169 | 305 | 123 | Whakarewarewa | 2011100400305262 |
| NULL | NULL | 850 | Whakarewarewa | NULL |
+--------------+------+-----+---------------+----------------
| contact_info | icon | id | title | lastmodified_by |
+--------------+------+-----+---------------+------------------+
| NULL | NULL | 123 | Paris | NULL |
| NULL | NULL | 850 | Paris | NULL |
+--------------+------+-----+---------------+----------------
我想删除具有较少数据的记录,如果所有字段值完全相同,则删除任何行。 有这样的千条记录。
答案 0 :(得分:3)
尝试这个两步解决方案:
运行此查询以查看所有重复项 - 记录数据较少 -
SELECT t1.* FROM table t1
JOIN (
SELECT
title,
MIN(IF(contact_info IS NULL, 0, 1) + IF(contact_info IS NULL, 0, 1) + IF(lastmodified_by IS NULL, 0, 1)) min_value_data,
MAX(IF(contact_info IS NULL, 0, 1) + IF(contact_info IS NULL, 0, 1) + IF(lastmodified_by IS NULL, 0, 1)) max_value_data
FROM table GROUP BY title HAVING min_value_data <> max_value_data
) t2
ON t1.title = t2.title AND IF(t1.contact_info IS NULL, 0, 1) + IF(t1.contact_info IS NULL, 0, 1) + IF(t1.lastmodified_by IS NULL, 0, 1) <> t2.max_value_data
将其重写为DELETE语句并执行。
然后运行此查询以删除除min ID之外的所有重复项:
DELETE t1 FROM table t1
JOIN (SELECT MIN(id) id, title FROM table GROUP BY title) t2
ON t1.id <> t2.id AND t1.title = t2.title;
答案 1 :(得分:1)
使用此选项重复,可以随意将其更改为删除语句:
SELECT * FROM `test`,
(SELECT title, count( title ) AS ttl
FROM `test`
GROUP BY title
HAVING ttl >1) AS sub
WHERE test.title = sub.title
AND contact_info IS NULL AND lastmodified_by IS NULL
答案 2 :(得分:0)
CREATE TEMPORARY TABLE my_temp(id INT(20)NOT NULL)ENGINE = MEMORY;
填写id以删除
INSERT INTO my_temp(id)SELECT id FROM tes1 AS main,(SELECT title,count(title)AS ttl FROM tes1 GROUP BY 标题HETING ttl&gt; 1)AS sub WHERE main.title = sub.title AND main.contact_info IS NULL AND main.lastmodified_by IS NULL GROUP BY main.contact_info,main.icon,main.title,main.lastmodified_by;
删除!
DELETE FROM tes1 WHERE id IN(从my_temp中选择id);
清理,注意:我们真的需要这个吗?
DROP TABLE my_temp;