Mysql 基于“合并”;分组方式;组

Mysql 基于“合并”;分组方式;组,mysql,sql,group-by,Mysql,Sql,Group By,因此,我有一个名为Activities表的表,其中包含user\u id,activity 每个用户都有一行,活动组合。 下面是一个可能的示例(添加了空行以便于查看,请忽略): 我希望基本上找到所有其他用户,他们的活动至少与给定的输入id相同,这样我就可以推荐具有类似活动的用户 因此,在上表中,如果我想找到user\u id=1的推荐用户,查询将返回user\u id=2和user\u id=4,因为他们同时从事游泳、跑步(以及更多),而不是user\u id=3,因为他们只从事游泳 因此,结果

因此,我有一个名为
Activities
表的表,其中包含
user\u id,activity

每个用户都有一行,活动组合。 下面是一个可能的示例(添加了空行以便于查看,请忽略):

我希望基本上找到所有其他用户,他们的活动至少与给定的输入
id
相同,这样我就可以推荐具有类似活动的用户

因此,在上表中,如果我想找到
user\u id=1
的推荐用户,查询将返回
user\u id=2
user\u id=4
,因为他们同时从事
游泳、跑步
(以及更多),而不是
user\u id=3
,因为他们只从事
游泳

因此,结果为单列:

| user_id |
|---------|
| 2       |
| 4       |
这正是我理想中想要的


就我所尝试的而言,我有点被困在如何获得一组坚实的
用户id=1
活动来匹配上。基本上,我在寻找的东西大致如下:

SELECT user_id from Activities
GROUP BY user_id
HAVING input_user_activities in user_x_activities
其中user1_活动只是输入用户活动的一组。我可以使用
创建该集合,并将输入用户活动设置为(…)
在开始时,我一直停留在
用户活动部分


有什么想法吗?

您可以通过使用
连接(查找所有公用行)和
分组(汇总每个用户id的相似性)以及最后使用
排序方式(首先返回最相似的用户),轻松地按相似性排序所有用户

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

.

要获得具有相同活动的用户,可以使用自加入。让我假设这些行是唯一的:

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
子句回答了您的问题——获取与给定用户具有相同活动的用户。

示例表数据很棒,但也指定了预期结果。我喜欢这个想法,没有办法直接访问group by的group吗?还是我想的不对?我不确定我是否理解这个问题。您是否只想要最相似的用户(如上面的示例所示),而不知道他们有多相似?因此您的查询是完美的。它对我很有效,而且速度很快。但是,是的,为了学习,我想看看是否有更好的方法,如果我们只想要相似的用户,而不知道他们有多相似(只要他们与输入用户有相同的活动),我喜欢这样。这就是我要找的,谢谢@这是如何回答你的问题的?如果没有任何用户的活动数与您搜索的用户的活动数完全相同,您不希望其他用户的活动数少于1个吗?这是一个公平的问题,但在这种情况下,这些用户不符合我称之为“匹配推荐”的最低资格@JoachimIsaksson的答案更具概括性,但这纯粹是基于个人偏好,我现在看到您已经编辑并更改了原始需求。这不是你应该问问题的方式。@forpas。我不知道你指的是什么。原始问题明确指出:“我希望基本上找到所有其他用户,他们的活动至少与给定的输入id相同,以便我可以推荐具有类似活动的用户。”这回答了这个问题;后面的编辑是澄清。
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);