我有一个用户对预定义的真/假问题列表的答案的数据集。数据如下所示:
+---------+-------------+--------+----+
| user_id | question_id | answer | id |
+-------------------------------------+
| 4 | 110 | 0 | 1 |
| 4 | 111 | 1 | 2 |
| 4 | 112 | 1 | 3 |
| 4 | 113 | 0 | 4 |
|---------+-------------+--------+----|
| 6 | 110 | 0 | 5 |
| 6 | 111 | 1 | 6 |
| 6 | 112 | 0 | 7 |
| 6 | 113 | 0 | 8 |
+---------+-------------+--------+----|
我需要找到的是每个用户的前10个最佳匹配(对系统中的每个用户运行一次)。因此,为了能够根据答案以最佳匹配的降序找到10个其他用户(例如,根据上面的示例,用户4和用户6根据他们的答案是75%兼容的。)
对此有一些限制,希望能让它变得更容易:
理想情况下,这应该能够处理那些已经回答了许多可能对每个人都不一样的问题的人(即他们跳过他们不想回答的问题。
感谢您的帮助!我真的不知所措。
答案 0 :(得分:1)
我的第一个是使用IF
。类似的东西:
SELECT SUM(IF(a.answer=b.answer,1,0)) AS match, b.user_id
FROM data_table AS a
JOIN data_table AS b ON a.question_id = b.question_id
WHERE a.user_id = n
AND b.user_id <> n
GROUP BY b.user_id
ORDER BY match DESC
LIMIT 10
其中n是您要测试的user_id