2014-06-18 29 views
0

我有一个搜索日志表,我保留搜索日志。表结构就像搜索字符串,日期,每个搜索字符串的结果数量作为结果和一些其他信息。我有以下SQL,我得到我需要的记录。一个关键字可以搜索多次,所以最新的日期是重要的。我使用下面的SQL来获取我需要的记录。它工作正常。如何删除数据库表中的记录,不包括来自另一个SQL的记录

SELECT id, searchstring, max(logdate) as logdate 
FROM log_search 
WHERE locale = 'en' AND results > 0 
GROUP BY searchstring 
ORDER BY logdate DESC 

我的问题是有数百万条记录,我需要清理它。我只想保留与上面的sql匹配的记录。

我试图使用NOT IN而不是id字段,但由于按logdate排序很重要,所以不让我。

DELETE FROM log_search WHERE id NOT IN (...MYQUERY...)但它给Operand should contain 1 column(s)错误

的另一个重要领域是locale。在删除en的记录时,我需要保留其他语言环境,即使它们与我上面的SQL不匹配。

有没有办法删除记录并保留我需要的记录。

编辑

表结构 编号 - 自动增量 搜索字符串 结果 - 结果是搜索字符串 LOGDATE的containt号 - 日期和时间搜索由

resultslogdate两者都很重要得到最新的查询返回结果。

解决方案/解决方法

@晴朗的回答技术上的工作,但对于像一些百万条记录大表,它的性能是可怕的。 Insted,我通过创建另一个表并将需要插入的记录插入到那里做了一个解决方法。这是我的SQL

INSERT INTO log_search_simple 
SELECT id, searchstring, max(logdate) as logdate, locale 
FROM log_search 
WHERE locale = 'en' AND results > 0 
GROUP BY searchstring 
ORDER BY logdate DESC 
+0

@echo_Me我试过DELETE FROM log_search WHERE ID不在(... MYQUERY ...),但它给'操作数应该包含1列(s)'错误 – Ergec

+0

@Ergec:检查我的回答! –

回答

0

你可以试试这个...

Delete from log_search where NOT EXISTS (SELECT id, searchstring, max(logdate) as logdate 
FROM log_search 
WHERE locale = 'en' AND results > 0 
GROUP BY searchstring 
ORDER BY logdate DESC) 
+0

首先没有工作。其次,使用NOT EXISTS不会让您在搜索和删除时在同一张桌子上工作。我复制它,并使用两个表,但受影响的行是零。 – Ergec

0

您尝试是正确的,你只需要选择ID的一列,而不是多个列的。

试试看。

   DELETE FROM log_search FROM log_search WHERE id Not in (SELECT id FROM log_search WHERE locale = 'en' AND results > 0 GROUP BY searchstring) 
+0

logdate很重要。需要保持最新的记录。 – Ergec

+0

我想你不需要在删除logdate。您需要由where子句指定的id行。 Logdate你只需选择它。 –

+0

这就是问题'Not In'不允许你在'SELECT'语句中使用多于一列' – Ergec

0

试试这个:

DELETE FROM log_search where id NOT IN(
SELECT id FROM (
SELECT id, searchstring, max(logdate) as logdate 
FROM log_search 
WHERE locale = 'en' AND results > 0 
GROUP BY searchstring 
ORDER BY logdate DESC 
) AS a); 

操作数应包含1列(S)

它看起来1列的列,并在这里与之相匹配的数据通过SELECT语句获得结果集中的三列。所以快速解决方案是从结果集中切分出一列并匹配列。它会做的伎俩:)

+0

从技术上讲,它可以工作,但实际上,我让它运行5分钟,并且只删除了大约30,000条记录。对大桌不是一个好主意。如果没有人发布更好的答案,我会接受它。 – Ergec

相关问题