Отредактировано на основе комментариев. Допустим, вы ищете статьи, которые:
- Имейте ключевое слово с именем 'a1'
- Или, пусть обе клавиатуры имеют названия 'b1' и 'b2'
- Или используйте ключевое слово "c1", "c2" или "c3"
Вы можете запросить как:
select a.id
from Articles a
inner join ArticleKeywords ak on ak.articleid = a.id
inner join Keywords k on k.id = ak.keywordid
group by a.id
having
sum(case when k.name in ('a1') then 1 else 0 end) = 1
or sum(case when k.name in ('b1','b2') then 1 else 0 end) = 2
or sum(case when k.name in ('c1','c2,'c3') then 1 else 0 end) > 0
Согласно комментарию SquareCog, вы можете значительно повысить производительность с помощью раннего предложения WHERE. Предложение ограничит группировку только соответствующими ключевыми словами. В вышеприведенном запросе добавьте WHERE непосредственно перед HAVING:
...
inner join Keywords k on k.id = ak.keywordid
where k.name in ('a1','b1','b2','c1','c2','c3')
group by a.id
...
Вы можете получить другие сведения о статье (статьях), например:
select *
from Articles
where id in (
...query from above here...
)
Допустим, у вас есть таблица, содержащая группы для поиска, определенные как:
groupid - keywordid
1 - 1
1 - 2
2 - 3
Значение статьи должно совпадать ((ключевое слово 1 и ключевое слово2) или ключевое слово3). Тогда вы можете запросить так:
select ak.articleid
from ArticleKeywords ak
inner join Search s on ak.keywordid = s.keywordid
group by s.searchgroup, ak.articleid
having count(*) = (
select count(*) from #Search s2 where s2.Searchgroup = s.SearchGroup
)