首先,我已经对此进行了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分钟)我没有'我知道自己做错了什么。 任何帮助将不胜感激。
答案 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并不是那么好,所以语法可能有些偏差。