gpt4 book ai didi

sql - 基于多对多关系匹配相似实体

转载 作者:行者123 更新时间:2023-12-04 05:07:59 27 4
gpt4 key购买 nike

我的数据库中有两个实体以多对多关系连接。我想知道基于它列出哪些实体具有最多相似性的最佳方法是什么?

我尝试使用 intersect 进行计数(*),但是查询需要很长时间才能在我的数据库中的每个条目上运行(大约有 20k 条记录)。运行我编写的查询时,CPU 使用率跃升至 100%,并且数据库存在锁定问题。

这是一些显示我尝试过的代码:

我的表格看起来像这样:

/* 20k records */
create table Movie(
Id INT PRIMARY KEY,
Title varchar(255)
);

/* 200-300 records */
create table Tags(
Id INT PRIMARY KEY,
Desc varchar(255)
);

/* 200,000-300,000 records */
create table TagMovies(
Movie_Id INT,
Tag_Id INT,
PRIMARY KEY (Movie_Id, Tag_Id),
FOREIGN KEY (Movie_Id) REFERENCES Movie(Id),
FOREIGN KEY (Tag_Id) REFERENCES Tags(Id),
);

(这有效,但速度非常慢)
这是我为尝试列出它们而编写的查询:
通常我也会使用 top 1 进行过滤并添加一个 where 子句来获取一组特定的相关数据。
SELECT 
bk.Id,
rh.Id
FROM
Movies bk
CROSS APPLY (
SELECT TOP 15
b.Id,
/* Tags Score */
(
SELECT COUNT(*) FROM (
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = bk.Id
INTERSECT
SELECT x.Tag_Id FROM TagMovies x WHERE x.Movie_Id = b.Id
) Q1
)
as Amount
FROM
Movies b
WHERE
b.Id <> bk.Id
ORDER BY Amount DESC
) rh

解释:
电影有标签,用户可以根据其他具有相似标签的电影尝试找到与他们选择的电影相似的电影。

最佳答案

嗯...只是一个想法,但也许我不明白...
此查询应按给定电影 ID 的标签返回最匹配的电影:

SELECT m.id, m.title, GROUP_CONCAT(DISTINCT t.Descr SEPARATOR ', ') as tags, count(*) as matches
FROM stack.Movie m
LEFT JOIN stack.TagMovies tm ON m.Id = tm.Movie_Id
LEFT JOIN stack.Tags t ON tm.Tag_Id = t.Id
WHERE m.id != 1
AND tm.Tag_Id IN (SELECT Tag_Id FROM stack.TagMovies tm WHERE tm.Movie_Id = 1)
GROUP BY m.id
ORDER BY matches DESC
LIMIT 15;

编辑:
我刚刚意识到它是用于 M$ SQL ......但也许可以做类似的事情......

关于sql - 基于多对多关系匹配相似实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020469/

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