2012-06-26 73 views
4

我正在尋找一種方法來計算單個表內整數之間的差異。MYSQL - 計算單個表內的差異

我打算一個MySQL表看起來像這樣:

user question answer 

1  1   3 
1  2   3 
1  3   2 
1  4   5 
1  5   1 

2  1   2 
2  2   3 
2  3   1 
2  4   5 
2  5   3 

3  1   3 
3  2   3 
3  3   4 
3  4   5 
3  5   3 

4  1   5 
4  2   3 
4  3   2 
4  4   5 
4  5   1 

每個用戶(在這個例子中)回答了5個問題,讓上規模的1回答5

我正在尋找的是用戶2,3和4中的哪一個給出了與用戶1提供的最相似的答案。

我想到的是計算由每個用戶的每個問題與用戶1的用戶相比較然後加上這些差異。

,添加後具有最低數量的用戶將是最相似的用戶1.

我很抱歉地說,我真的不知道從哪裏開始構建一個查詢,有效地做到這一點,是想知道是否有人可以指出我正確的方向? 我也歡迎任何有關建立相同結果的更好或更合理方法的建議。

回答

0
SELECT SUM(ABS(t2.answer - t1.answer)) AS total_diff, t2.user 
FROM my_table AS t1 
LEFT JOIN my_table AS t2 USING(question) 
WHERE t1.user = 1 AND t2.user != t1.user 
GROUP BY t2.user 
ORDER BY total_diff ASC 

結果:

total_diff user 
2  4 
4  2 
4  3 
+0

爽一把,兄弟....... – beck03076

+0

是的,這是完美的。非常感謝您的時間和您的幫助 – BarfordSimon

0
SELECT 
yt1.user, 
SUM(CASE WHEN yt1.answer = yt2.answer THEN 1 ELSE 0 END) AS howMuchAnswersInCommon 
FROM yourTable yt1 
INNER JOIN yourTable yt2 ON yt1.question = yt2.question 
WHERE yt2.user = 1 AND yt1.user != 1 
GROUP BY yt1.user 
ORDER BY howMuchAnswersInCommon DESC 
; 

這會給你一個最常見的答案,在上面用戶1。

測試數據:

/* 
create table yourTable (user int, question int, answer int); 
insert into yourTable values 
(1,  1,   3), 
(1,  2,   3), 
(1,  3,   2), 
(1,  4,   5), 
(1,  5,   1), 

(2,  1,   2), 
(2,  2,   3), 
(2,  3,   1), 
(2,  4,   5), 
(2,  5,   3), 

(3,  1,   3), 
(3,  2,   3), 
(3,  3,   4), 
(3,  4,   5), 
(3,  5,   3), 

(4,  1,   5), 
(4,  2,   3), 
(4,  3,   2), 
(4,  4,   5), 
(4,  5,   1); 
*/ 

OUTPUT:

user howMuchAnswersInCommon 
4   4 
3   3 
2   2 
+0

由於答案是範圍,你不能計算相似性與平等。你應該計算回答之間的範圍。 – vearutop

+0

感謝tombom,這是一個有趣的替代方法,我仍然可以使用 – BarfordSimon

+0

@BarfordSimon不幸的是,我誤解了你的問題。但隨時提出我的答案,因爲這字面意思是「標記答案是有用的」。 :) – fancyPants