Я использую sqlite3 и пытаюсь выбрать все статьи, в которых есть какой-либо из (или всех) заданных тегов.
CREATE TABLE article (
id INTEGER NOT NULL,
title TEXT NOT NULL,
PRIMARY KEY (id),
UNIQUE (title)
);
CREATE TABLE tag (
id INTEGER NOT NULL,
name TEXT NOT NULL,
PRIMARY KEY (id),
UNIQUE (name)
);
CREATE TABLE drill_to_tag (
tag_id INTEGER NOT NULL,
article_id INTEGER NOT NULL,
PRIMARY KEY (tag_id, article_id),
FOREIGN KEY(tag_id) REFERENCES tag (id),
FOREIGN KEY(article_id) REFERENCES article (id)
);
Допустим, идентификатор тега 4 - это «новости», идентификатор тега - 5 это «европа», а тег id 6 - это «США».
Я могу получить статьи с тегом id 4, используя:
select a.title from article a
inner join article_to_tag
on a.id = article_to_tag.article_id
where article_to_tag.tag_id = 4;
Но что я действительно хочу, так это способ получить статьи появляются в таблице «многие ко многим» с обоими тегами 4 и 5 - европейские новости.
Этот запрос делает это, но кажется уродливым?
select a.id, a.title from article a
inner join article_to_tag atag1
on a.id = atag1.article_id
inner join article_to_tag atag2
on a.id = atag2.article_id
where atag1.tag_id = 4 and atag2.tag_id = 5;
И этот кажется еще более уродливым.
select a.id, a.title from article a
where
a.id in (select article_id from article_to_tag where article_id = 4)
and
a.id in (select article_id from article_to_tag where article_id = 5);
Есть ли лучший тип объединения или какой-либо другой способ сформировать этот запрос?