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 
+0

谢谢!在收集每个项目等级的结果方面做得很好,即使它将结果加倍。在多个项目中查找具有最低组合diff_rank的用户对仍然无法解决。我想我可以编写每个用户对的数组脚本,并在mysql之外添加diff_rank?也可以过滤a.user-b.user b.user-a.user重复。尽管我可以在mysql中完成所有工作。 – barnamos

+0

答案已更新.. – scaisEdge