gpt4 book ai didi

sql - 在 SQL 中指定最小连接点数

转载 作者:行者123 更新时间:2023-12-04 05:50:16 26 4
gpt4 key购买 nike

我有这个连接表:

 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 表中可以找到十个或更多两个 intItemId 共有的 intTagId,这很好,我们选择它 - 否则忽略它。

所以,例如给定这个数据:
 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)

假设匹配阈值为 2。

如果种子是 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,低于阈值)。

任何想法如何做到这一点,请?

干杯,
马特

最佳答案

SELECT
[foreign].intItemID
FROM
#TagMap AS [primary]
INNER JOIN
#TagMap AS [foreign]
ON [foreign].intTagID = [primary].intTagID
WHERE
[primary].intItemID = 1
GROUP BY
[foreign].intItemID
HAVING
COUNT(distinct [foreign].intTagID) >= @threshold

但是请注意,这扩展得非常糟糕;因为 JOIN搜索“有 任何 这些标签”,然后只在 HAVING 中搜索条款可以指定“具有 所有 这些标签”。

根据我的经验,您可以进行小幅优化,但我发现最有值(value)的方法是将结果缓存到更标准的映射表中。在必要时更新它们。 (标签数据的内容很少改变。)

关于sql - 在 SQL 中指定最小连接点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com