SQL найти статьи со ВСЕМ набором тегов - PullRequest
5 голосов
/ 09 сентября 2009

Поиск статей с ЛЮБЫМ набором тегов - это относительно простое объединение, и оно уже обсуждалось: Лучшая структура БД (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>)

(По сути, считается, если количество релевантных тегов является ожидаемым значением.)

1 Ответ

7 голосов
/ 09 сентября 2009
select article_id
from  applied_tags 
where tag_id in (<input tag set here>)
group by article_id
having count(*) = <count of input tags>

Это должно сделать это. Я не буду клясться, что это самый эффективный способ, но он будет делать то, что вы хотите, предполагая, что tag_id + article_id является первичным ключом для application_tags. Если это не так (т. Е. У вас могут быть дубликаты тегов), все ставки выключены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...