2017-10-06 83 views
1

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或類似的查詢結構。

回答

0

可以使用自加入

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