你好,我正在尝试开发一种方法来查询值和失败值之间的兼容性或相似性。它不是最高或最低的 AVG 评级,而是数字或行上的值之间的最小差异。因此,如果结构类似于以下内容,其中 RANK 是用户的“评级”。
USER ITEM RANK
A x 5
B x 6
C x 2
A y 2
B y 3
C y 8
A z 7
B z 4
C z 4
最后,我希望能够像这样对数据进行排序:
用户 A 与用户 B 的平均评分相差 3
用户 A 与用户 C 的平均评分相差 4
用户 B 与用户 C 的平均评分相差 5
到目前为止,我唯一的想法是为每个排列构建一个临时表(巨大):
col1 col2 dif item
A B 1 x
A C 3 x
等等... 然后用 GROUP 求和。但这仍然不能正确处理用户 A 和 C 在某些项目上匹配更紧密并且在其他项目上具有更大差异以超过初始接近度的情况。任何人都可以给出任何方向吗?
谢谢!
这是一个 mysql 5.5 db,所以我在查询结构上遗漏了任何 CTE 或类似内容。
最佳答案
可以使用自连接
select a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by item, diff_rank asc
为了避免重复的值,你可以使用不同的
select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by item, diff_rank asc
为了获得差异最低的用户,您可以更改顺序
select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item = b.item and a.user <> b.user
order by diff_rank asc
关于MySQL 兼容性或相似度排名查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613690/