代码之家  ›  专栏  ›  技术社区  ›  aaronasterling

在外键引用列中选择任意数量的具有N个不同值的行

  •  0
  • aaronasterling  · 技术社区  · 14 年前

    数据库架构无效

    CREATE TABLE sites
    (
        site_id           INTEGER PRIMARY KEY AUTOINCREMENT,
        netloc            TEXT UNIQUE NOT NULL,
        last_visited      REAL DEFAULT 0,
        crawl_rate        REAL DEFAULT 2,
        crawl_frequency   REAL DEFAULT 604800,
        robots_txt        TEXT DEFAULT 0,
        robots_last_fetch REAL DEFAULT 0,
        allow_all         NUMERIC DEFAULT 0,
        disallow_all      NUMERIC DEFAULT 0,
        active            NUMERIC DEFAULT 0                           
     )
    
    CREATE TABLE urls
    (
         url_id       INTEGER PRIMARY KEY AUTOINCREMENT,
         site_id      INTEGER REFERENCES sites (id) NOT NULL,
         scheme       TEXT NOT NULL,
         path         TEXT NOT NULL,
         last_visited REAL DEFAULT 0,
         UNIQUE( site_id, scheme, path)                                   
     )
    

    你可能会猜到,这是一个网络爬虫。

    前面提到的URL。url是可爬网的,如果 url.last_visited + site.crawl_frequency < current_time time.time() 功能。我要找的可能会从以下内容开始:

    SELECT s.*, u.* FROM sites s, urls u ON s.site_id = u.site_id ...
    

    GROUP BY 可能要扮演一些角色。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Dan LaRocque    14 年前

    这是一个不礼貌的问题。可能还有更聪明的方法。

    SELECT s.*, u.* 
    FROM sites s, urls u ON s.site_id = u.site_id
    WHERE s.site_id IN 
        (SELECT DISTINCT site_id
         FROM urls uu INNER JOIN sites ss ON uu.site_id = ss.site_id
         WHERE uu.last_visited + ss.crawl_frequency < current_time 
         ORDER BY ss.site_id
         LIMIT n);
    

    子查询应该返回到 n 不同的 site_id 至少有一个可爬网的URL。这个 ORDER BY 属性不必是 站点id . 事实上 完全没有必要。我只是把它放在那里,因为在处理新查询时,一致性很好。

    封闭查询返回所有 url 与…相关联的 不同的 site s、 每个 网站 网址 网址 返回的对象必须是可爬行的;唯一的保证是至少有一个 网址 网站 网站 可能是不可爬行的 s、 我也是。

    如果只有爬行 网址 s,则可以在封闭查询中复制计时条件。我无法从这个问题中分辨出需要哪种行为。

    另外,我现在沉迷于迂腐,但是 crawl_frequency crawl_period crawl_delay