Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
用于多重包含和排除的MySQL复杂联接_Mysql_Inner Join - Fatal编程技术网

用于多重包含和排除的MySQL复杂联接

用于多重包含和排除的MySQL复杂联接,mysql,inner-join,Mysql,Inner Join,我有个客户想让我做一个标签系统。我有三个表:items、tags和item_tag_assoc——最后一个表只用于关联item_id和tag_id。我的问题是: 如果用户请求包含标记[1,2,3]和排除标记[4,5,6],则结果应该是[1,2,3]中包含每个标记的所有项目,而不是[4,5,6]中只有一个且没有标记。如何编写查询来实现这一点 我做了足够多的研究来找出标记包含的内部联接: 在tia1.item\U id=i.item\U id和tia1.tag\U id=1上,从项目中选择i.ite

我有个客户想让我做一个标签系统。我有三个表:items、tags和item_tag_assoc——最后一个表只用于关联item_id和tag_id。我的问题是:

如果用户请求包含标记[1,2,3]和排除标记[4,5,6],则结果应该是[1,2,3]中包含每个标记的所有项目,而不是[4,5,6]中只有一个且没有标记。如何编写查询来实现这一点

我做了足够多的研究来找出标记包含的内部联接:

在tia1.item\U id=i.item\U id和tia1.tag\U id=1上,从项目中选择i.item\U id、i.item\U title作为tia1的内部连接标记\U item\U assoc作为tia1

…只需在相同的内部连接模式上链接您想要包含的任意多个标记即可。它可能有点笨重,但用户在继续之前选择的标签不会超过4或5个,所以就可以了

我真的希望我能以同样的方式排除,并将所有内容封装到一个查询中:

内部连接标记\项目\关联为tia2上的tia2。项目\ id=i.item\ id和tia2.tag\ id!=二,

但很快就很明显,这是行不通的。我读了几篇文章,说左外连接可以让我排除,而我包含,但我无法理解它们,主要是因为游离的WHERE子句。我尝试的左外连接和内连接的任何排列要么产生错误,要么产生非常混乱的结果


所有这些都是要说的——这里有人知道我是如何做到这一点的吗?我很抱歉没有提供任何有用的代码示例。如果内部连接是一个障碍,我可以从头开始——我只需要一种同时完成多个关联包含和排除的方法。提前感谢您的帮助和专业知识

您需要将记录实例的数量与标记的数量相匹配:

SELECT a.item_id -- , add other columns here
FROM   items a
          INNER JOIN item_tag_assoc b
             ON a.item_id = b.item_id
WHERE b.tag_id IN (1, 2, 3) AND
      b.tag_id NOT IN (4, 5, 6)
GROUP BY a.item_id
HAVING COUNT(a.item_id) = 3

找到了答案。而不是像这样添加内部联接:

内部连接标记\项目\关联为tia2上的tia2。项目\ id=i.item\ id和tia2.tag\ id!=二,

我添加了一个具有单个内部联接的子查询:

其中,i.item_id不在4、5、6中,从项中选择i.item_id作为tia1.item_id=i.item_id和tia1.tag_id上的tia1

子查询创建了一组具有[4,5,6]中任何标记的所有项,其中i.iten_id NOT in消除了与该集合匹配的任何记录


谢谢大家的努力!希望这将有助于今后的工作。

可以简单到1、2、3中的标记不完全匹配-1、2、3将项目与标记[1]、[1、3]等匹配。我只需要找到集合中每个标记都有的项目[1、2、3]。感谢您的回复,希望澄清!如果您能提供相同的示例数据和示例输出,这将非常有用。谢谢您的回答,这比我提出的解决方案要优雅得多。有没有一种方法可以用类似的方法排除标签?不完全是这样-1,2,3很好,但是4,5,6部分在我看来是错误的。我们是不是包括了我们想要排除的那一套?哦,对不起。我现在看到了,它不应该在里面。你能再试一次吗@CodeMoose?希望它现在能工作。由于某些原因,它现在不接受任何标记-所有查询返回空结果。尝试更改并转到或@CodeMooseI所做的-仍然不是我想要的。谢谢你的努力!
SELECT a.*
FROM items a
     INNER JOIN item_tag_assoc b
         ON a.item_id = b.item_id
     INNER JOIN tags c
         ON a.tag_id = c.tag_id
WHERE c.tag_id IN(1) AND
      c.tag_id IN(2) AND
      c.tag_id IN(3) AND
      c.tag_id NOT IN (4) AND
      c.tag_id NOT IN (5) AND
      c.tag_id NOT IN (6) ;