php - 单表 INTERSECT 替代方案

标签 php mysql join inner-join intersect

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

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

每个文档可以与多个关键字关联,每个关键字也可以与多个文档关联。不幸的是一个简单的AND语句无法实现我所需要的,因为没有单行可以满足 KeywordID 的多个值,而是通过将出版物的 ID 包含在具有不同 keywordsID 的多行上来与多个关键字相关联。

我正在尝试编写一个查询,该查询将为我提供一个用所有任意数量的关键字标记的文档列表。我最初的尝试如下,它使用 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 子句,您可以在查找关键字组合的逻辑上拥有很大的灵 active 。

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

相关文章:

sql - 如何扩展sql表?

python - 在不更改原始列名的情况下合并 pandas DataFrame

mysql - SQL 内连接分组依据

php - WP_Query Woocommerce 按属性和变化常规价格过滤可变产品

php - 交响乐 2 : How to avoid the sessions table being dropped by doctrine migrations?

php - 从android上传大视频文件到服务器

mysql - 如何在MySQL中有效地从最大的N条记录中选择一条随机记录(不使用子查询)?

php - 如何在 codeigniter 中使用单个查询将数据插入两个单独的表中?

php - 通过 HTTPS 从远程服务器复制图像

mysql - 查找受影响的行