我有一个搜索日志表,我保留搜索日志。表结构就像搜索字符串,日期,每个搜索字符串的结果数量作为结果和一些其他信息。我有以下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号 - 日期和时间搜索由
results
和logdate
两者都很重要得到最新的查询返回结果。
解决方案/解决方法
@晴朗的回答技术上的工作,但对于像一些百万条记录大表,它的性能是可怕的。 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
@echo_Me我试过DELETE FROM log_search WHERE ID不在(... MYQUERY ...),但它给'操作数应该包含1列(s)'错误 – Ergec
@Ergec:检查我的回答! –