根据“分组依据”分组进行合并

时间:2019-09-29 19:33:55

标签: mysql sql group-by

所以我有一个名为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=2user_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部分

有什么想法吗?

2 个答案:

答案 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

An SQLfiddle to test with