假设我们有一个这样的数据库:
Project_tbl:
-----------------
id | Project_name
-----------------
1 | A
2 | B
3 | C
-----------------
personel_project_tbl:
--------------------
user_id | Project_id
--------------------
1 | 1
2 | 2
3 | 1
3 | 2
2 | 3
--------------------
instrument_project_tbl:
--------------------------
instrument_id | Project_id
--------------------------
1 | 1
1 | 2
2 | 2
2 | 1
1 | 3
--------------------------
现在,我需要对项目列表进行排序,并根据它们与项目A的相似性对其进行排名。
例如:
A和B在3个用户中共有1个用户,在2个工具中有2个用户,因此它们的相似度排名是(1/2 + 2/2)/ 2 = 75%
A和C没有共同的用户,但拥有2台以上的仪器中的1台,因此(1/2)/ 2 = 25%
所以B比be更相似,输出应该是
--------------
项目| 秩
--------------
2 | 75
3 | 25
这是我想到的第一个解决方案…
如果我是在PHP和MySQL中完成的,那将是这样的:
for all tables as table_x
for all projects (except A) as prj_y
unique = (Select distinct count(items) from table_x where project is A)
count += (Select distinct count(items) from table_x
where project is prj_x and items are in
(select distinct items from table_x where project is a)
)/unique
因此,复杂度将为O( n 2),并且使用索引编制索引时,选择也将花费O(log n ),而这是无法承受的。
您是否有想法完全在MySQL中完成或以更好,更快的方式进行?
*更多信息和注释:*
我仅限于PHP和MySQL。
这只是一个例子,在我的实际项目中,表有20多个表,因此该解决方案应该具有 高性能 。
这个问题是对这个问题的补充问题:如果yr解决方案可以同时或以某种方式应用于两者(在某种程度上),那么可以在MySQL数据库中获得重复最多的相似字段(这将是巨大的)。我想将相关项目的价值乘以项目的相似性以获得最佳选择…
总之,这两个问题将是:获得最相关的项目,获得所有项目的相似项目,并为当前项目找到最相似的项目,其中该项目也与当前项目相似!哟
感谢您的智力回答,如果您能对情况有所了解,我们将不胜感激
你可以做这样:
SET @Aid = (SELECT id
FROM Project_tbl
WHERE Project_name = 'A');
SELECT P.id
, (IFNULL(personel.prop, 0) +
IFNULL(instrument.prop, 0)
)/2*100 Rank
, personel.prop AS personell
, instrument.prop AS instrument
FROM Project_tbl P
LEFT JOIN
( SELECT B.Project_id pid, COUNT(*)/C.ref prop
FROM personel_project_tbl A,
personel_project_tbl B,
(SELECT COUNT(*) AS ref
FROM personel_project_tbl
WHERE Project_id = @Aid
) AS C
WHERE A.user_id = B.user_id
AND A.Project_id = @Aid
GROUP BY B.Project_id
) personel ON P.id = personel.pid
LEFT JOIN
( SELECT B.Project_id pid, COUNT(*)/C.ref prop
FROM instrument_project_tbl A,
instrument_project_tbl B,
(SELECT COUNT(*) AS ref
FROM instrument_project_tbl
WHERE Project_id = @Aid
) AS C
WHERE A.instrument_id = B.instrument_id
AND A.Project_id = @Aid
GROUP BY B.Project_id
) instrument ON P.id = instrument.pid
WHERE P.id <> @Aid
ORDER BY Rank DESC
想法是每个表都有一个子查询,并且这些子查询中的每一个将项目ID映射到给定表的对应率。
我什么都没说关于性能。您将不得不尝试看看它是否足够快地满足您的需求,但是正如我所看到的那样,由于必须检查所有数据,因此无法克服您提到的O( n
2)复杂性。
我在mongodb中收集了一些代表过去和未来事件的文档。文档中有两个日期字段“开始”和“结束”,它们是bson ISODATE对象。我正在做一个查找查询,它获取了不超过3天前结束的所有事件。 如何根据事件的今天和结束日期之间的时间(和日期)对该查询的响应进行排序。换句话说,2天前结束的事件应该发生在大约与2天后发生的事件相同的位置。这很重要,因为我不想首先显示所有已经发生的事件,也不想首先显示未来
问题内容: 正在搜寻 这不起作用....我到处搜索并阅读了文档。但是我只是看不到如何根据他们的“所有者”关系名称对我的(基础)查询进行排序。 它总是导致: 这一定很容易…但是我看不到。还研究了比较器,这似乎合乎逻辑,但是我看不到ORDER BY的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。 问题答案: SQLAlch
本文向大家介绍MySQL查询以字符串字段中的数字字符对行进行分组?,包括了MySQL查询以字符串字段中的数字字符对行进行分组?的使用技巧和注意事项,需要的朋友参考一下 为此,您可以在+运算符的帮助下将0与字符串字段连接起来。这里的场景就像我们需要从字符串字段“ 9844Bob ”中获取数字“ 9844 ”。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所
问题内容: 我有一个类型字段。即使它是type ,它也存储带有可选前导零的整数值。排序按字典顺序排序(在之前)。如何订购的数值(来之前)? 当前,我使用查询: 问题答案: 有几种方法可以做到这一点: 将它们存储为数值而不是字符串。您已经打折了,因为您希望保持字符串像完整的前导零。 按字符串顺序转换为数字。这将起作用,但请注意,这对于大型数据库而言是性能的杀手er。每行函数的扩展性不是很好。 添加第
问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进
Hibernate5.2.10 查询DSL(jpa,apt)4.1.4 Spring Boot 1.5.6 Spring Data JPA(因此,使用存储库) 存储库扩展 选择以下meetupCampaign.id=x *meetupCampaign.ApprovalStatus=y的关联会议: *meetupCampaign.id=x *meetupCampaign.ApprovalStatus