单表INTERSECT替代

时间:2016-01-01 20:40:54

标签: php mysql join inner-join intersect

我目前正在开发一个系统,允许用关键字标记文档,并有一个表格表格:

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

每个文档都可以与许多关键字相关联,并且每个关键字都可以与许多文档相关联。遗憾的是,简单的AND语句无法满足我的需要,因为没有一行会满足KeywordID的多个值,而是通过在具有不同keywordID的多行中包含其ID来将出版物与多个关键字相关联。

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

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

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

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

但是我刚刚得知MySQL不支持INTERSECT语句。我一直在寻找替代方案,但我在替换INTERSECT时发现的所有资源都集中在它用于合并来自两个不同表的结果。在这种情况下,我无法看到转换为另一个语句的方法,例如INNER JOIN

如何在不使用INTERSECT语句允许与MySQL兼容的情况下,使这样的查询工作?

1 个答案:

答案 0 :(得分:2)

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

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

这是标准SQL,应该可以在任何数据库中使用。此外,通过修改HAVING子句,您可以灵活地选择要查找的关键字组合的逻辑。