我有一个带文件表的数据库
DocumentID DocTitle DocDesc
和关键字表
KeywordID Keyword
通过DocumentKeyword表链接
DocumentID KeywordID
我使用了一个视图来提供所有文档关键字实现的数据集。
DocumentID DocTitle DocDesc Keyword
我正在寻找一个select语句,让我按关键字搜索文档。对于一个关键字,我可以做到这一点没问题。但我希望能够为查询使用多个关键字,并为使用所有给定关键字标记的文档返回documentID(一次)。
我陷入困境,我最大的问题是我甚至无法找到要搜索的内容。我意识到这个观点可能没有必要。
非常感谢任何帮助。
由于
答案 0 :(得分:5)
如果您需要指定keyword
而不是keywordid
值,请使用:
SELECT d.documentid
FROM DOCUMENT d
JOIN DOCUMENTKEYWORD dk ON dk.documentid = d.documentid
JOIN KEYWORD k ON k.keywordid = dk.keywordid
AND k.keyword IN ('keyword1', 'keyword2', 'keyword3')
GROUP BY d.documentid
HAVING COUNT(DISTINCT k.keyword) = 3
关键是IN和HAVING子句的组合 - COUNT必须与IN
子句中提供的值的数量相匹配。
如果是keywordid
,您可以保存加入并使用:
SELECT d.documentid
FROM DOCUMENT d
JOIN DOCUMENTKEYWORD dk ON dk.documentid = d.documentid
AND dk.keywordid IN (1, 2, 3)
GROUP BY d.documentid
HAVING COUNT(DISTINCT dk.keywordid) = 3
答案 1 :(得分:0)
您不需要视图来执行您的操作(尽管如果您认为它可以使您的代码更清晰,您可以自由使用它)。使用AND(最好使用ORM进行SQL争用)是最简单的。
我认为这也会有效(虽然我不建议使用它):
SELECT DISTINCT documents.DocumentID
FROM documents
WHERE (SELECT DISTINCT count(*) FROM DocumentKeyword
WHERE KeywordID = ANY
(SELECT keyword.KeywordID FROM keyword
WHERE Keyword
IN ('keyword 1', 'keyword 2', 'keyword 3'))
AND DocumentID = documents.DocumentID)) = 3;
答案 2 :(得分:0)
OMG Ponies提交的声明,但重构使用该观点:
SELECT
d.documentid
FROM
v_AllDocumentKeyword d
WHERE
d.keyword IN ('Keyword1','Keyword2','Keyword3')
GROUP BY
d.documentid
HAVING
COUNT(DISTINCT d.keyword) = 3
由于