组合键上的Sqlite相对补码

时间:2016-10-29 20:33:57

标签: java sqlite ormlite

关于我的问题的第一个背景:
我正在构建一个爬虫,我想监视一些高分列表 高分列表由两个参数定义:类别和集合(一起唯一) 下载成功后,我创建了一个新的统计数据条目(category,collection,createdAt,...)

问题:我想每天只查询一次高分榜。所以我需要一个返回24h内未下载的类别和集合的查询。 应使用统计表。
我列出了所有可能的类别和所有可能的集合。他们像交叉联接一样工作。 所以基本上我需要交叉连接的相对补充与最后24h的条目

我的想法:交叉加入类别和集合,并“减去”所有在过去24小时内创建的统计数据条目(类别,集合)

问题1:是否可以在查询中定义类别和集合并交叉加入它们,还是必须为它们创建表格?

问题2:我的想法是正确的做法吗?你会如何在Sqlite中做到这一点?

好的,我意识到这可能听起来令人困惑,所以我画了一个我真正想要的图像。 enter image description here

我对C.感兴趣。

这是我目前在java中的代码,也许有助于理解这个问题:

public List<Pair<String, String>> getCollectionsToDownload() throws SQLException {
  long threshold = System.currentTimeMillis() - DAY;
  QueryBuilder<TopAppStatistics, Long> query = queryBuilder();
  List<TopAppStatistics> collectionsNotToQuery = query.where().ge(TopAppStatistics.CREATED_AT, threshold).query();

  List<Pair<String, String>> toDownload = crossJoin();
  for (TopAppStatistics stat : collectionsNotToQuery) {
    toDownload.remove(new Pair<>(stat.getCategory(), stat.getCollection()));
  }
  return toDownload;
}

private List<Pair<String, String>> crossJoin() {
  String[] categories = PlayUrls.CATEGORIES;
  String[] collections = PlayUrls.COLLECTIONS;
  List<Pair<String, String>> toDownload = new ArrayList<>();
  for (String ca : categories) {
    for (String co : collections) {
      toDownload.add(new Pair<>(ca, co));
    }
  }
  return toDownload;
}

1 个答案:

答案 0 :(得分:1)

对您的问题最简单的解决方案是除外。假设你有一个子查询 计算A和计算B的另一个。这些查询 可能非常复杂。关键是两者都应返回相同数量的列和可比较的数据类型。

在SQLite中,您可以这样做:

gem install cocoapods

就这么简单。

例如:

<your subquery 1> EXCEPT <your subquery 2>

请记住,两个子查询都必须返回相同数量的列。