我该如何为自引用SELECT编写SQL,该自引用SELECT的某些字段与同一字段不同,而另一些条件不相同?

问题描述

我有以下(简化的)表:

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.comsub.example.com。在以上数据示例中,example.org应该匹配。

我已经用JOINWHERE (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 (将#修改为@)