Поиск статей с ЛЮБЫМ набором тегов - это относительно простое объединение, и оно уже обсуждалось: Лучшая структура БД (MySQL): статьи, содержащие избранные теги
Но что, если я ищу и хочу найти статьи со ВСЕМ набором тегов?
Для конкретности предположим следующие таблицы:
CREATE TABLE `articles` (
`id` INT NOT NULL
);
CREATE TABLE `applied_tags` (
`tag_id` INT NOT NULL,
`article_id` INT NOT NULL
);
CREATE TABLE `search_tags` (
`search_id` INT NOT NULL,
`tag_id` TAG NOT NULL
);
Я придумал это, что, я думаю, могло бы сработать, но оно массивное, некрасивое и довольно неясное, поэтому я считаю, что должен быть лучший способ:
Select articles.id from articles
where
( select count(*) from applied_tags
where applied_tags.article_id == articles.id
and applied_tags.tag_id in (select search_tags.tag_id from search_tags where search_tags.search_id == <input>)
==
(select count(*) from search_tags where search_tags.search_id == <input>)
(По сути, считается, если количество релевантных тегов является ожидаемым значением.)