如何从数据库表中删除记录,不包括来自另一个SQL的记录

时间:2014-06-18 08:44:59

标签: mysql 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,但由于按日志排序很重要,所以不要让我。

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

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

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

修改

表结构 Id - 自动增量 搜索字符串 results - 包含该searchstring的结果数 logdate - 进行搜索的日期和时间

resultslogdate对于获取返回结果的最新查询非常重要。

解决方案/替代方法

@ Sunny的答案在技术上有效,但对于像数百万条记录这样的大表,它的表现很糟糕。 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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 )

答案 2 :(得分: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列

它查找1列以匹配列的数据,并且在这里它通过SELECT语句获得结果集中的三列。因此,快速解决方案是从结果集中切片列并匹配列。它会做的伎俩:)