如何将 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)
我有一个名为 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)