我有这个加入表:
CREATE TABLE [TagMap](
[intItemId] [bigint] NOT NULL,
[intTagId] [bigint] NOT NULL,
CONSTRAINT [PK_TagMap_intItemId] PRIMARY KEY CLUSTERED
(
[intItemId] ASC,
[intTagId] ASC
))
我的 sproc 发现与 seedItemId 关联的标签,然后选择与这些标签关联的其他 intItemId,如下所示:
declare @baseTags table (intTagId bigint primary key clustered);
INSERT INTO @baseTags (intTagId)
SELECT TOP 20 t1.intTagId
FROM TagMap t1
WHERE t1.intItemId = 776
SELECT TOP 500 t1.intItemId
FROM TagMap t1
JOIN @baseTags t2
ON t1.intTagId = t2.intTagId
GROUP BY t1.intItemId
ORDER BY Count(*) DESC
我需要做的是在两个 intItemIds 之间指定一个最小标签关联数 - 比如 10 - 低于该值不返回值。也就是说在TagMap 表中可以找到十个或更多的两个intItemIds 共有的intTagIds,这很好,我们选择它——否则忽略它。
因此,例如给定以下数据:
CREATE TABLE #TagMap(
[intItemId] [bigint] NOT NULL,
[intTagId] [bigint] NOT NULL,
CONSTRAINT [PK_TagMap_intItemId] PRIMARY KEY CLUSTERED
(
[intItemId] ASC,
[intTagId] ASC
))
insert into #TagMap
(intItemId, intTagId)
values
(1, 100),(1, 200),(1, 300),
(2, 100),(2, 200), (2, 500),(2, 600),
(3, 100), (3, 500),(3, 600)
假设匹配阈值为二。
如果种子是 intItemId 1,则只应返回 intItemId 2(它有两个匹配的标签 Id:100 和 200,而 intItemId 3 有一个:100,低于阈值)。
如果种子是 intItemId 2,则应返回 intItemId 1 和 3(intItemId 1 匹配标签 ID 100 和 200,而 intItemId 3 匹配标签 ID 500 和 600)。
如果种子是 intItemId 3,则只应返回 intItemId 2(它有两个匹配的标签 ID:500 和 600,而 intItemId 有一个:100,低于阈值)。
请问有什么办法吗?
干杯,马特