我有一个搜索日志表,我保留搜索日志。表结构类似于搜索字符串,日期,每个搜索字符串的结果数量作为结果和一些其他信息。我有以下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 - 进行搜索的日期和时间
results
和logdate
对于获取返回结果的最新查询非常重要。
解决方案/替代方法
@ 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
答案 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语句获得结果集中的三列。因此,快速解决方案是从结果集中切片列并匹配列。它会做的伎俩:)