问题描述
我有以下(简化的)表:
CREATE TABLE IF NOT EXISTS `resource` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`host` TEXT NOT NULL,`inspecting` INTEGER DEFAULT 0,`visitedAt` TEXT
);
可以有多个记录,它们具有相同的host
值和/或一个被视为host
的子域的值。例如:
id | host | inspecting | visitedAt
---------------------------------------------------------
1 | example.com | 0 | null
2 | example.com | 0 | 2020-09-28 00:00:00
3 | sub.example.com | 1 | null
4 | example.org | 0 | null
因此,这些主机可能已被访问或当前可以被检查。我想找到最旧的主机,该主机最近没有被访问过并且当前未被检查,并且该主机也不被认为是最近访问或当前被检查的主机的子域。
因此,假设example.com
当前正在检查中或最近被访问过,那么我不想匹配example.com
或sub.example.com
。在以上数据示例中,example.org
应该匹配。
我已经用JOIN
和WHERE (NOT) EXISTS
尝试了各种查询,但是我无法使其正常工作。
最接近的查询类似(虽然可能不准确):
SELECT `self`.*
FROM `resource` AS `self`
WHERE
`self`.`inspecting` != 1 AND
(`self`.`visitedAt` IS NULL OR datetime( `self`.`visitedAt` ) <= datetime( 'now','-10 minutes' )) AND
NOT EXISTS (
SELECT 1
FROM
`resource` AS `probe`
WHERE
`probe`.`inspecting` = 1 AND
(`self`.`host` = `probe`.`host` OR `self`.`host` LIKE "%." || `probe`.`host`) AND
(`probe`.`visitedAt` IS NOT NULL AND datetime( `probe`.`visitedAt` ) > datetime( 'now','-10 minutes' ))
)
ORDER BY `self`.`visitedAt` ASC
LIMIT 1
是否可以通过单个查询过滤出这样的行?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)