Я думаю, что первый запрос не даст никакого результата, не так ли? Это потому, что «и» в речи отличается от «и» в программировании. Когда вы говорите, что вам нужны ключевые слова «работа» и «задача», вы на самом деле имеете в виду, что вам нужны строки, где ключевым словом является «работа» или «задача». Ключевое слово не может быть одновременно «заданием» и «заданием», поэтому запрос не будет возвращать никаких строк. Вы можете заменить OR
на IN
в виде
WHERE KW.Keyword in ('job', 'task')
Но это, вероятно, не даст вам желаемого результата. Я подозреваю, что вам нужно найти статьи, которые соответствуют обоим ключевым словам.
Чтобы проверить, есть ли в базе знаний оба ключевых слова, вам может понадобиться что-то вроде этого (хотя я не уверен, что Access принимает это:
select
*
from
knowledge K
where
exists
(select 'x' from
knowledge_keywords KKW
inner join keywords KW on KW.id = KKW.keywordid
where
KKW.knowledgeid = K.id and
KW.keyword = 'job')
and exists
(select 'x' from
knowledge_keywords KKW
inner join keywords KW on KW.id = KKW.keywordid
where
KKW.knowledgeid = K.id and
KW.keyboard = 'task') and
[править]
Другой подход, который может работать лучше в Access (извините, я не могу его проверить), заключается в использовании такого подсчета. Я сделал небольшое предположение о полях в K для этого примера.
Таким образом, вы присоединяете каждое ключевое слово в списке. Для статьи базы знаний, в которой есть и «задание», и «задание», сначала будет возвращено две строки. Эти строки затем группируются по полям Знания, и строки подсчитываются. Только статьи, количество которых соответствует общему количеству ключевых слов, возвращаются.
Возможная проблема: если статья имеет одно и то же ключевое слово (задание), связанное дважды, она все равно возвращается. Эту проблему можно решить, не допуская этого, используя уникальные ограничения.
select
K.ID,
K.Title,
K.Content
from
knowledge K
inner join knowledge_keywords KKW on KKW.knowledgeid = K.id)
inner join keywords KW on KW.id = KKW.keywordid
where
KW.keyword in ('job', 'task')
group by
K.ID,
K.Title,
K.Content
having
count(*) = 2 /* Number of keywords */