我有一个客户想让我做一个标签系统。我有三个表:items
、tags
和item_tag_assoc
- 最后一个仅用于关联 item_ids 和 tag_ids。这是我遇到的问题:
如果用户请求包含标签 [1, 2, 3] 和排除标签 [4, 5, 6],则结果应该是在 [1, 2, 3] 中具有每个标签(不仅仅是一个)且没有标签的所有项目在 [4, 5, 6] 中。如何编写查询来完成此操作?
我进行了足够的研究以找出标签包含的内部连接:
SELECT i.item_id, i.item_title FROM items AS i INNER JOIN tag_item_assoc AS tia1 ON (tia1.item_id = i.item_id AND tia1.tag_id = 1)
...并且只需在相同的内部连接模式上链接您想要包含的尽可能多的标签。它可能有点笨重,但用户在继续之前不会选择超过 4 或 5 个标签,所以它会做。
我真的希望我能以同样的方式排除,并将所有内容包装到一个查询中:
INNER JOIN tag_item_assoc AS tia2 ON (tia2.item_id = i.item_id AND tia2.tag_id!= 2)
但很快就变得很明显,这是行不通的。我读了几篇文章说LEFT OUTER JOIN
s 可以让我在包含时排除,但我无法弄清楚,主要是因为杂散WHERE
子句。LEFT OUTER JOIN
我尝试的s 和s 的任何排列INNER JOIN
要么产生错误,要么产生非常混乱的结果。
说了这么多——这里有人知道我怎么能做到这一点吗?我很抱歉没有提供任何有用的代码示例。如果 s 是一个障碍,我可以从头开始INNER JOIN
- 我只需要一种方法来同时完成多个关联包含和排除。提前感谢您的帮助和专业知识!