首先一些关于我的问题的背景:
我正在构建一个爬虫,我想监控一些高分列表。
高分列表由两个参数定义:类别和集合(共同唯一)。
成功下载后,我创建一个新的统计条目(类别、集合、createdAt,...)
问题:我只想每天查询一次高分列表。所以我需要一个查询来返回 24 小时内未下载的类别和集合。
为此应使用统计表。
我有一个所有可能的类别和所有可能的集合的列表。它们的工作方式类似于交叉连接。
所以基本上我需要交叉连接与过去 24 小时的条目的相对补充
我的想法:交叉连接类别和集合,并“减去”过去 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;
}
最佳答案
解决您的问题的最简单的方法是异常(exception)。假设你有一个子查询 一个计算 A,另一个计算 B。这些查询 可能非常复杂。关键是两者都应返回相同数量的列和可比较的数据类型。
在 SQLite 中你可以这样做:
<your subquery 1> EXCEPT <your subquery 2>
就这么简单。
例如:
SELECT a, b FROM T where a > 10
EXCEPT
SELECT a,b FROM T where b < 5;
请记住,两个子查询必须返回相同的列数。
关于java - 组合键上的 Sqlite 相对补集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323408/