【发布时间】:2012-07-21 12:01:23
【问题描述】:
假设我们有一个这样的数据库:
Project_tbl:
personel_project_tbl:
instrument_project_tbl:
现在,我需要对项目列表进行排序,并根据它们与项目 A 的相似性对它们进行排名。
例如:
A 和 B 在 3 个用户中有 1 个共同用户,在 2 个仪器中有 2 个仪器,因此它们的相似度排名为 (1/2 + 2/2) / 2 = 75%
A 和 C 没有共同的用户,但有 1 比 2 仪器,所以它将是 (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(n2) 并且索引选择也会花费 O(log n) 这不会'买不起。
您有什么想法是完全在 MySQL 中完成,还是以更好更快的方式完成?
********更多信息和说明:**
-
我仅限于 PHP 和 MySQL。
-
这只是一个例子,在我的实际项目中,表有 20 多个表,因此该解决方案应该具有高性能。
-
这个问题是这个问题的补充问题:Get the most repeated similar fields in MySQL database 如果你的解决方案可以以某种方式对他们俩都使用或应用(不知何故),那就太好了。 我想将相关项目的价值与项目的相似性相乘以获得最佳选择...
总之,这两个问题将:获取最相关的项目,获取所有项目的相似项,并找到当前项目最相似的项目,该项目也与当前项目相似!哟
感谢您的智慧回答,如果您能对情况有所了解,我们将不胜感激
【问题讨论】:
-
我想得到这个计算。 A 和 B 在 3 个用户中有 1 个共同用户,在 2 个仪器上有 2 个仪器,所以他们的相似度排名是 (1/2 + 2/2) / 2 = 75% ...应该是 (1/3+2 /2)/2 =67% ?
-
@JoeGJoseph 超过项目 A 的 2 个用户
标签: php mysql sql inner-join