如何将 table 和 SQL 中的数组相交

How to intersect the table and array in SQL

我有一个名为 Item 的 table。每个项目可以有 1 到 N 个标签。
标签存储在另一个名为 Tag 的 table 中。所以,我有传递依赖。

ID | TagID | ItemID
---|-------|-------
1  |1      |1
2  |2      |1
3  |4      |1
4  |2      |2
5  |3      |2
... 

所以,我还有另一个 table,名为 Block。作为table项,它也有标签,但是Block和Tag之间的关系存储在另一个table中。

每个标签都有一个名称,最重要的是,我可以有两个标签,名称相同,但它们与不同的 table 相关(一个与 Block 相关,另一个与 Item 相关)。

Example of Tag table:
ID | Name  | CreatedAt
---|-------|------------
1  | Good  | <Some Date>
2  | Good  | <Some Date>
3  | Bad   | <Some Date>
4  | Worst | <Some Date>
5  | Worst | <Some Date>

Block has tags "Good" with ID 1, "Worst" with ID 4.
Item has tags "Good" with ID 2, "Worst" with ID 5.


我想做什么:我正在收集与特定 Block 相关的标签,然后我正在寻找与 Items 相关的同名标签。因此,如果我正在收集 ID 为 1 和 4 的标签,作为输出,我会收到标签 2 和 5。

最有趣的部分:我想找到具有所有必需标签的项目。所以,我想找到具有标签 2 和 5 的项目('AND' 逻辑)。

P.S。这是我尝试过的,但我不知道如何改进它:

SELECT bt.TagID
FROM BlockTag as bt
WHERE bt.BlockID = 1114

INTERSECT

SELECT DISTINCT t.ID
FROM Tag as t, BlockTag as nt
WHERE nt.TagID = t.ID AND t.Name IN (
  SELECT t.Name
  FROM ItemTag as it, Tag as t
  WHERE it.TagID = t.ID AND it.ItemID = 2
)

我尝试了 INTERESCT、IN 和 JOIN LEFT - 没有任何帮助。 我该怎么做这个数组交集?

我无法完全重现您的情况,但我认为以下方法可行:

SELECT i.ItemId, COUNT(*)
FROM BlockTag AS bt
  INNER JOIN Tag AS t ON t.[ID] = bt.TagID
  INNER JOIN TagName AS tn ON tn.[Name] = t.[Name]
  INNER JOIN Item AS i ON i.TagId = tn.TagId
GROUP BY i.ItemId
HAVING COUNT(*) = (SELECT COUNT(*) FROM Item AS i2 WHERE i2.ItemId = i.ItemId)