#mysql #sql
#mysql #sql
Вопрос:
У меня есть база данных переводов, и мне нужно найти переменные, которые не переведены на определенные основные языки, а также переменные, которые переведены на один определенный язык, но не на другой.
Упрощенная версия базы данных выглядит следующим образом:
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. Что вы пробовали до сих пор?
Ответ №1:
Вы можете использовать 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;