互访地点的SQL查询

互访地点的SQL查询,sql,ruby-on-rails,ruby-on-rails-3,postgresql,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,我正在用Rails 3/PostgreSQL为我的大学做一个项目,在那里我们有用户、活动和场地。一个用户有很多活动,一个场地有很多活动。活动属于用户和场馆,因此具有用户id和场馆id 我需要的是一个SQL查询,甚至是Rails本身的一个方法?找到多个用户之间的共同场所。例如,我有5个用户访问过不同的场馆。5个用户只访问了2个场馆。所以我想找回这两个场地 我从检索5个用户的所有活动开始: SELECT a.user_id as user, a.venue_id as venue FROM acti

我正在用Rails 3/PostgreSQL为我的大学做一个项目,在那里我们有用户、活动和场地。一个用户有很多活动,一个场地有很多活动。活动属于用户和场馆,因此具有用户id和场馆id

我需要的是一个SQL查询,甚至是Rails本身的一个方法?找到多个用户之间的共同场所。例如,我有5个用户访问过不同的场馆。5个用户只访问了2个场馆。所以我想找回这两个场地

我从检索5个用户的所有活动开始:

SELECT a.user_id as user, a.venue_id as venue
FROM activities AS a
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879
但现在我需要一种方法来找出共同的场地。 有什么想法吗

thx,
tux

您必须为搜索提供一些参数。例如,5个用户可能有2个共用场地,但不是3个

如果您想了解这五位用户的共同点,可以从以下步骤开始:

SELECT a.venue_id, count(1) as NoOfUsers
FROM activities AS a
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879
group by a.venue_id
这会让你知道,对于那些用户来说,有多少用户拥有这个场地。所以你有一定程度的场地共享

但是,如果您只想查看五位用户访问过的场馆,您可以在最后添加一行:

SELECT a.venue_id, count(1) as NoOfUsers
FROM activities AS a
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879
group by a.venue_id
having count(1) = 5 --the number of users in the query

你也应该考虑从

改变你的WHERE语句
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879


在sql中,它类似于:

Select distinct v.venue_id
from v.venues
join activities a on a.venue_id = v.venue_id
Join users u on u.user_id = a.user_id
Where user_id in (116,227,229,613,879)

你需要把你的桌子连接起来,这样才能得到所有有活动的场地,这些活动都有用户。当您刚开始学习时,如果您使用子查询,有时将其可视化会更简单。至少我发现了这一点。

我并不完全熟悉postgresql的sql语法,但请尝试以下方法:

从活动中选择场地id、COUNTdistinct用户id 其中11627229613879中的用户id 按地点分组 具有COUNTdistinct用户_id=5

编辑:

您需要将“5”更改为您关心的用户数量

我在表结构上进行了测试,如下所示:

user_id venue_id id ----------- ----------- ----------- 1 1 1 2 6 2 3 3 3 4 4 4 5 5 5 1 2 6 2 2 7 3 2 8 4 2 9 5 2 10 结果是:

venue_id ----------- ----------- 2 5
对不起,那不行。您的查询中有一个错误,应该是来自场馆的v。我得到了用户拥有的所有场地,但不是他们共同拥有的场地。thx,这解决了问题难以置信的快速回答顺便说一句;,下面的M.R.也用几乎相同的方法解决了这个问题。他得到了名声,因为你拥有更多;对不起!但是,你应该知道,有些人可能会因此而气馁:对此我很抱歉。我也试着把这两篇文章都标为答案,但那不起作用。但是谢谢你的帮助!像你和M.R.这样的人是我如此热爱这个社区的原因;谢谢你的回答,它解决了它!正如我在阿德里安的帖子评论中所写,你会得到声誉积分; venue_id ----------- ----------- 2 5