MySQL兼容性或相似性排名查询
问题描述:
G'day,我试图开发一种方法来查询值和失败之间的兼容性或相似性。它不是最高或最低的AVG评级,而是一个或多个数值之间的最小差异。因此,如果结构类似于以下内容,其中RANK是USER的“评级”。MySQL兼容性或相似性排名查询
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的平均等级差Vs用户C具有平均4
用户B对用户C的评分差异有5
我唯一的想法的平均等级相差这么远是建立一个临时表(巨大)与每一个排列:
col1 col2 dif item
A B 1 x
A C 3 x
等等 ,然后用GROUP总和。但是,对于用户A和C在某些项目上更接近并且对其他项目的差异大于初始接近度的场合,这仍然无法正确处理。任何人都可以给的方向?
谢谢!
这是一个MySQL 5.5分贝,所以我错过了任何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
并获得具有最低DIFF firts用户可以通过
更改顺序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
谢谢!在收集每个项目等级的结果方面做得很好,即使它将结果加倍。在多个项目中查找具有最低组合diff_rank的用户对仍然无法解决。我想我可以编写每个用户对的数组脚本,并在mysql之外添加diff_rank?也可以过滤a.user-b.user b.user-a.user重复。尽管我可以在mysql中完成所有工作。 – barnamos
答案已更新.. – scaisEdge