单个 table INTERSECT 替代方案
Single table INTERSECT alternative
我目前正在开发一个系统,允许用关键字标记文档并具有 table 形式:
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
的资源都集中在它用于合并来自两个不同 table 的结果。在这种情况下,我看不到一种方法可以转换为另一个语句,例如 INNER JOIN
.
如何在不使用 INTERSECT
语句允许与 MySQL 兼容的情况下进行这样的查询?
我喜欢使用聚合和 having
子句来处理这些查询:
SELECT documentID
FROM KeywordsToDocuments
WHERE KeywordID IN (keyword1, keyword2)
GROUP BY documentID
HAVING COUNT(*) = 2;
这是标准的 SQL,应该适用于任何数据库。此外,通过修改 HAVING
子句,您可以在查找的关键字组合逻辑上有很大的灵活性。
我目前正在开发一个系统,允许用关键字标记文档并具有 table 形式:
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
的资源都集中在它用于合并来自两个不同 table 的结果。在这种情况下,我看不到一种方法可以转换为另一个语句,例如 INNER JOIN
.
如何在不使用 INTERSECT
语句允许与 MySQL 兼容的情况下进行这样的查询?
我喜欢使用聚合和 having
子句来处理这些查询:
SELECT documentID
FROM KeywordsToDocuments
WHERE KeywordID IN (keyword1, keyword2)
GROUP BY documentID
HAVING COUNT(*) = 2;
这是标准的 SQL,应该适用于任何数据库。此外,通过修改 HAVING
子句,您可以在查找的关键字组合逻辑上有很大的灵活性。