关于我的问题的第一个背景:
我正在构建一个爬虫,我想监视一些高分列表
高分列表由两个参数定义:类别和集合(一起唯一)
下载成功后,我创建了一个新的统计数据条目(category,collection,createdAt,...)
问题:我想每天只查询一次高分榜。所以我需要一个返回24h内未下载的类别和集合的查询。
应使用统计表。
我列出了所有可能的类别和所有可能的集合。他们像交叉联接一样工作。
所以基本上我需要交叉连接的相对补充与最后24h的条目
我的想法:交叉加入类别和集合,并“减去”所有在过去24小时内创建的统计数据条目(类别,集合)
问题1:是否可以在查询中定义类别和集合并交叉加入它们,还是必须为它们创建表格?
问题2:我的想法是正确的做法吗?你会如何在Sqlite中做到这一点?
好的,我意识到这可能听起来令人困惑,所以我画了一个我真正想要的图像。
我对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;
}
答案 0 :(得分:1)
对您的问题最简单的解决方案是除外。假设你有一个子查询 计算A和计算B的另一个。这些查询 可能非常复杂。关键是两者都应返回相同数量的列和可比较的数据类型。
在SQLite中,您可以这样做:
gem install cocoapods
就这么简单。
例如:
<your subquery 1> EXCEPT <your subquery 2>
请记住,两个子查询都必须返回相同数量的列。