2016-12-15 2 views
0

У меня есть эти две таблицы в SQLiteDistinct топ 10 из нескольких таблиц

CREATE TABLE "freq" (
    `id` INTEGER, 
    `translation_id` INTEGER, 
    `freq` INTEGER DEFAULT NULL, 
    `year` INTEGER, 
    PRIMARY KEY(`id`), 
    FOREIGN KEY(`translation_id`) REFERENCES `translation`(`id`) DEFERRABLE INITIALLY DEFERRED 
) 

CREATE TABLE translation (
    id   INTEGER PRIMARY KEY, 
    w_id  INTEGER, 
    word  TEXT DEFAULT NULL, 
    located_in TEXT, 
    UNIQUE (word, language) 
    ON CONFLICT ABORT 
) 

на основе значений из этих таблиц, которые я хочу, чтобы создать третий, который содержит верхние 10 слов для каждого translation.located_in для каждого freq.year. Это может выглядеть следующим образом:

CREATE TABLE top_ten_words_by_country (
    id   INTEGER PRIMARY KEY, 
    located_in TEXT, 
    year  INTEGER, 
    `translation_id` INTEGER, 
    freq  INTEGER, 
    FOREIGN KEY(`translation_id`) REFERENCES `translation`(`id`) DEFERRABLE INITIALLY DEFERRED 
) 

То, что я пытался (для одной страны и одного года) до сих пор:

SELECT * FROM freq f, translation t 
WHERE t.located_in = 'Germany' ORDER BY f.freq DESC 

, который имеет следующие проблемы:

  • она не добавить несколько слов от translation, которые имеют одинаковые w_id (что означает, что они являются переводом друг от друга)
  • он работает только на одну да г и одна страна
  • это занимает veeeeery долго (я знаю, что соединения являются дорогостоящими, поэтому его не так важно, чтобы ускорить этот процесс)
  • содержит дубликат translation.word

Так может кто-нибудь предоставить мне способ сделать что я хочу?

Скорость - это наименее важная вещь для меня.

ответ

1

Посмотрите, у вас есть декартовой продукт (между вашими таблицами нет никакой связи). Кроме того, вы должны использовать предложение «group by». И вы можете создать представление вместо таблицы. Изменить запрос:

SELECT sum(f.freq) total_freq 
    , t.w_id 
    , t.located_in 
    , f.year 
    FROM freq f 
    , translation t 
WHERE f.translation_id = t.id 
group by t.w_id 
     , t.located_in 
     , f.year 
ORDER BY total_freq DESC 
Смежные вопросы