我有一个用户对是/否投票问题的回答的 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 个)。
我编写了一个查询,它将为我提供两个指定用户的相同响应数:
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 |
我的直觉告诉我,有一种方法可以将其作为一个庞大的 MySQL 查询来执行,而不必通过 PHP 中的循环执行一堆查询。谁能指出我正确的方向?