我目前正在使用一种系统,以使文档可以用关键字标记并具有以下形式的表格:

CREATE TABLE `KeywordsToDocuments` (
    `keywordID` int NOT NULL,
    `documentID` int NOT NULL);


每个文档可能与许多关键字相关联,并且每个关键字可能与许多文档相关联。不幸的是,一个简单的AND语句无法满足我的需要,因为没有一行可以满足KeywordID的多个值,相反,发布通过将其ID包含在具有不同keywordID的几行中而与多个关键字相关联。

我正在尝试编写一个查询,该查询将为我提供带有所有任意数量的关键字标记的文档的列表。我最初的尝试是使用INTERSECT语句的以下内容:

SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword1
INTERSECT
SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword2
...


其中...可以是任意数量的其他关键字的类似语句。该查询由PHP脚本动态构建。

我在这里要做的是分别找到与每个关键字相关联的所有文档,然后从这些结果集中找到相交的部分,这些相交将是与所有请求的关键字相关联的文档。

但是我刚刚了解到MySQL不支持INTERSECT语句。我一直在寻找替代方法,但是我发现替换INTERSECT的所有资源都集中在将其用于合并来自两个不同表的结果上。在这种情况下,我看不到一种转换为其他语句(例如INNER JOIN)的方法。

如何在不使用INTERSECT语句允许与MySQL兼容的情况下进行此类查询?

最佳答案

我喜欢使用聚合和having子句处理这些查询:

SELECT documentID
FROM KeywordsToDocuments
WHERE KeywordID IN (keyword1, keyword2)
GROUP BY documentID
HAVING COUNT(*) = 2;


这是标准的SQL,可以在任何数据库中使用。另外,通过修改HAVING子句,您可以在所需关键字组合逻辑上具有很大的灵活性。

关于php - 单表INTERSECT替代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34559858/

10-12 17:19