4

単一のテーブル内の整数間の差を計算する方法を探しています。

次のような 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 に最も似ています。

申し訳ありませんが、これを効率的に行うクエリの作成をどこから始めればよいか本当にわかりません。誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか? 私はまた、同じ結果を構築するためのより良い、またはより論理的な方法についての提案も受け付けています.

4

2 に答える 2

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
于 2012-06-26T14:46:50.997 に答える
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);
*/

出力:

user    howMuchAnswersInCommon
4           4
3           3
2           2
于 2012-06-26T14:58:44.627 に答える