はい/いいえの投票質問に対するユーザーの回答のMySQLテーブルがあります。次のようになります。
| user_id | poll_id | response |
|------------|----------|-----------|
| 111 | 1 | 'yes' |
| 111 | 2 | 'no' |
| 111 | 3 | 'no' |
| 222 | 1 | 'yes' |
| 222 | 2 | 'yes' |
| 222 | 3 | 'yes' |
| 333 | 1 | 'no' |
| 333 | 2 | 'no' |
| 333 | 3 | 'no' |
各ユーザーの応答と他のすべてのユーザーの応答との類似性を計算したいと思います。したがって、ユーザー 111 とユーザー 222 は 0.333 類似しており (3 回中 1 回同じ応答があるため)、ユーザー 111 とユーザー 333 は 0.666 回類似しています (3 回中 2 回同じ応答があるため)。
指定された 2 人のユーザーに対して同じ応答の数を返すクエリを作成しました。
SELECT COUNT(*) AS same_count
FROM (
SELECT response
FROM results
WHERE user_id = 111
) AS t1
, (
SELECT response
FROM results
WHERE user_id = 222
) AS t2
WHERE t1.response = t2.response
現在、すべてのユーザーの情報を取得して、次のような結果を生成する方法を見つけようとしています。
| user_1 | user_2 | same_count |
|---------|----------|--------------|
| 111 | 222 | 0.333 |
| 111 | 333 | 0.666 |
| 222 | 111 | 0.333 |
| 222 | 333 | 0 |
| 333 | 111 | 0.666 |
| 333 | 222 | 0 |
または、可能であれば、冗長な情報なしで:
| user_1 | user_2 | same_count |
|---------|----------|--------------|
| 111 | 222 | 0.333 |
| 111 | 333 | 0.666 |
| 222 | 333 | 0 |
私の直感では、PHP のループを介して一連のクエリを実行することなく、単一の巨大な MySQL クエリとしてこれを行う方法があることがわかりました。誰かが私を正しい方向に向けることができますか?