删除特定的重复行并保留一行

时间:2015-03-26 00:58:50

标签: mysql optimization

首先,我已经对此进行了2个小时的研究,之后我在此处进行了全面的研究。这里有类似的问题,但没有一个与我的问题相符(所以请不要将其标记为重复)。

我有一个超过~100000条记录的巨大表格,而我想要做的就是删除某些重复的行。

示例I'以下行:

ID   NAME   NUMBER
1    'NIL'  1234
2    'NIL'  1234
3    'NIL'  1234
4    'MES'  5989
5    'NL'   1235
6    'NL'   12385
7    'NL'   1235
8    'MES'  5989

预期输出(要保留的ID或要删除的ID并不重要):

ID   NAME   NUMBER
1    'NIL'  1234
2    'NIL'  1234
3    'NIL'  1234
4    'MES'  5989
5    'NL'   1235
6    'NL'   12385

我试过这个:

DELETE FROM tableA
WHERE ID NOT IN
(
    SELECT ID From (SELECT * FROM tableA) AS t1
    WHERE PHONE NOT IN (1235,5989)
    GROUP BY NAME, NUMBER
 UNION
    SELECT MIN(ID) From (SELECT * FROM tableA) AS t2
    WHERE PHONE IN (1235,5989)
    GROUP BY NAME, NUMBER
)

以上查询在10行或20行的测试数据上工作得很好但是当应用于实时数据库时,它需要很长时间并且无休止地获取行(查询已经运行,因为现在超过40分钟)我没有'我知道自己做错了什么。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

CREATE TABLE tableB like tableA;
INSERT INTO tableB (SELECT * FROM tableA GROUP BY name,number);
RENAME TABLE tableA to tableA_with_dups, tableB to tableA;

*请注意,这不一定是最佳解决方案,具体取决于这是一个正在运行的系统,表格索引等。如果您有更多要求,只需添加到评论中,我将添加更合适的答案

*也可以,请为我们运行:SHOW CREATE TABLE tableA;然后我们可以正确地利用索引。

答案 1 :(得分:0)

我会将内部子句放在临时表中并从中进行选择。

CREATE TEMPORARY TABLE IF NOT EXISTS IdsToKeep AS 
(SELECT ID From (SELECT * FROM tableA) AS t1
WHERE PHONE NOT IN (1235,5989)
GROUP BY NAME, NUMBER
UNION
SELECT MIN(ID) From (SELECT * FROM tableA) AS t2
WHERE PHONE IN (1235,5989)
GROUP BY NAME, NUMBER)

DELETE FROM tableA
WHERE ID NOT IN
(SELECT ID FROM IdsToKeep)

不幸的是,我对MySql并不是那么好,所以语法可能有些偏差。