所以我有一个名为Activities
的表,其中包含user_id, activity
的模式
对于每个用户,活动组合都有一行。 这是它的外观(添加了空行以使内容更易于查看,请忽略):
| user_id | activity |
|---------|-----------|
| 1 | swimming | -- We want to match this
| 1 | running | -- person's activities
| | |
| 2 | swimming |
| 2 | running |
| 2 | rowing |
| | |
| 3 | swimming |
| | |
| 4 | skydiving |
| 4 | running |
| 4 | swimming |
我希望基本上找到所有具有 至少与给定输入id
相同活动的其他用户,以便向具有相似活动的用户推荐。
因此在上表中,如果我想找到user_id=1
的推荐用户,该查询将返回user_id=2
和user_id=4
,因为他们同时参与swimming, running
(以及更多) ),而不是user_id=3
,因为它们只参与swimming
所以只有一列结果:
| user_id |
|---------|
| 2 |
| 4 |
这是我理想中要寻找的
就我所尝试的而言,我有点固守于如何获得一组可靠的user_id=1
活动的基础。基本上,我正在寻找以下方面的东西:
SELECT user_id from Activities
GROUP BY user_id
HAVING input_user_activities in user_x_activities
其中user1_activities只是我们输入的用户活动的集合。我可以在一开始使用WITH input_user_activities AS (...)
来创建该集合,而我坚持使用的是user_x_activities
部分
有什么想法吗?
答案 0 :(得分:1)
要使用户具有相同的活动,可以使用自我联接。让我假设这些行是唯一的:
select a.user_id
from activities a1 join
activities a
on a1.activity = a.activity and
a1.user_id = @user_id
group by a.user_id
having count(*) = (select count(*) from activities a1 where a1.user_id = @user_id);
having
子句回答了您的问题-获取具有与给定用户相同活动的用户。
答案 1 :(得分:0)
您可以使用JOIN
(查找所有常见行)和GROUP BY
(总结每个user_id的相似性),最后使用ORDER BY
来按相似度轻松排序所有用户。首先返回最相似的用户。
SELECT b.user_id, COUNT(*) similarity
FROM activities a
JOIN activities b
ON a.activity = b.activity
WHERE a.user_id = 1 AND b.user_id != 1
GROUP BY b.user_id
ORDER BY COUNT(*) DESC