Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单表交叉方案_Php_Mysql_Join_Inner Join_Intersect - Fatal编程技术网

Php 单表交叉方案

Php 单表交叉方案,php,mysql,join,inner-join,intersect,Php,Mysql,Join,Inner Join,Intersect,我目前正在开发一个系统,允许使用关键字标记文档,并具有以下表格: CREATE TABLE `KeywordsToDocuments` ( `keywordID` int NOT NULL, `documentID` int NOT NULL); 每个文档都可能与许多关键字关联,并且每个关键字都可能与许多文档关联。不幸的是,一个简单的和语句并不能满足我的需要,因为没有一行会满足KeywordID的多个值,相反,一个发布通过在多个具有不同KeywordID的行上包含其ID与多个关

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

CREATE TABLE `KeywordsToDocuments` (
    `keywordID` int NOT NULL,
    `documentID` int NOT NULL);
每个文档都可能与许多关键字关联,并且每个关键字都可能与许多文档关联。不幸的是,一个简单的
语句并不能满足我的需要,因为没有一行会满足KeywordID的多个值,相反,一个发布通过在多个具有不同KeywordID的行上包含其ID与多个关键字相关联

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

SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword1
INTERSECT
SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword2
...
其中,
可以是任意数量的类似语句,用于进一步的关键字。此查询由PHP脚本动态构建

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

但是我刚刚了解到MySQL不支持
INTERSECT
语句。我一直在寻找替代方案,但我在替换
INTERSECT
上找到的所有资源都集中在它上,用于合并来自两个不同表的结果。在这种情况下,我看不到转换为另一条语句的方法,例如
内部联接


如果不使用
INTERSECT
语句来允许与MySQL兼容,如何实现这样的查询?

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

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

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

连接应该是正确的方式。您已经尝试了哪些连接没有达到预期的结果?@ArSeN我还没有尝试连接,因为我不确定如何使用连接实现所需的语义。这是我人生的精髓problem@splash58那就找一个单行等于两行否?那是永远不会发生的。好吧,你知道联接是如何工作的吗?如果没有,你可能应该仔细阅读。如果加入实际上是错误的选择,那么我没有完全理解你的问题。请您详细说明一下您的表结构,以及您想要查询的结果是什么?@Vality我重新阅读了您的问题。我错了,那太好了,我没有想过要用一个。谢谢,这看起来确实比我的原始代码(包括
INTERSECT
)更整洁。我一会儿就接受。