Поиск строк без определенных детей - PullRequest
3 голосов
/ 17 апреля 2019

У меня есть база данных для перевода, и мне нужно найти переменные, которые не переведены на некоторые основные языки, а также переменные, которые переведены на один определенный язык, но не на другой.

Упрощенная версия базы данныхвыглядит так:

CREATE TABLE var (
       id int unsigned primary key auto_increment,
       name varchar(15)
);

CREATE TABLE language (
       id smallint unsigned primary key auto_increment,
       name varchar(31),
       ietf varchar(5)
);

CREATE TABLE translation (
       var_id  int unsigned not null,
       lang_id smallint unsigned not null,
       val varchar(128),
       PRIMARY KEY(var_id, lang_id),
       CONSTRAINT trans_fk_var
                  FOREIGN KEY(var_id)
                  REFERENCES var(id),
       CONSTRAINT trans_fk_lang
                  FOREIGN KEY(lang_id)
                  REFERENCES language(id)
);


insert into var (name) values ('var1'),('var2'),('var3');
insert into language (name, ietf) values ('German', 'de'), ('Spanish', 'es'), ('German (Austria)', 'de-AT'), ('Spanish (Mexico)', 'es-MX');
insert into translation values (1,1, 'string 1'), (1,2, 'string 2'), (1,3, 'string 3'), (2,1, 'string 4'), (2,2, 'string 5'), (3,1, 'string 6');

Я пытаюсь выяснить следующие запросы:

  • Какие переменные не переведены хотя бы на один из языков 1 и 2 (вэтот пример var 3)
  • Какие переменные переведены на язык 2, но не на язык 4 (в этом примере переменные 1 и 2)

Указанные запросы будут выполняться довольно часто, ибаза данных большая, поэтому мне нужно, чтобы запросы были как можно более дешевыми.

1 Ответ

0 голосов
/ 17 апреля 2019

Вы можете использовать group by и having. Итак, ваш первый вопрос можно сформулировать так:

select var_id
from translations t
group by var_id
having count(*) < (select count(*) from language);

А второй как:

select var_id
from translations t
group by var_id
having sum(lang_id = 2) > 0 and
       sum(lang_id = 4) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...