2016-10-29 4 views
1

Вначале немного о моей проблеме:
Я строю гусеничный ход, и я хочу отслеживать списки рекордов.
Списки рекордов определяются двумя параметрами: категорией и коллекцией (вместе уникальными).
После успешной загрузки я создаю запись о новой записи (категория, коллекция, createdAt, ...)Sqlite относительное дополнение на комбинированном ключе

Проблема: Я хочу запросить список рекордов только один раз в день. Поэтому мне нужен запрос, который будет возвращать категорию и коллекцию, которые не были загружены за 24 часа. Для этого следует использовать таблицу статистики.
У меня есть список всех возможных категорий и всех возможных коллекций. Они работают как крест. Итак, в основном мне нужно относительное дополнение к перекрестному соединению с записями последних 24 часов

Моя идея: перекрестные категории и коллекции и «вычитание» всей пары (категории, коллекции) записей статистики, которые были созданы во время последние 24 часа

Вопрос 1: Можно ли определять категории и коллекции внутри запроса и перекрестно присоединяться к ним или мне нужно создать таблицу для них?

Вопрос 2: Правильно ли моя идея? Как вы это сделаете в Sqlite?

Хорошо, я понимаю, что это может показаться запутанным, поэтому я нарисовал образ того, что я действительно хочу. enter image description here

Я заинтересован в С.

Вот мой текущий код в 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

Самое простое решение вашей проблемы является КРОМЕ. Скажем, у вас есть подзапрос , который вычисляет 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; 

Помните, что оба подзапросов должны возвращать одинаковое число столбцов.

 Смежные вопросы

  • Нет связанных вопросов^_^