相互访问的地方的SQL查询

时间:2011-04-27 20:17:25

标签: sql ruby-on-rails ruby-on-rails-3 postgresql

我正在为我的大学开发一个项目,使用Rails 3 / PostgreSQL,我们有用户,活动和场地。用户有许多活动,场地有许多活动。活动属于用户和场所,因此具有user_id和venue_id。

我需要的是SQL查询(甚至是Rails本身的方法?)来查找多个用户之间的相互位置。例如,我有5个用户访问过不同的场地。 5个用户只访问了2个场馆。所以我想找回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

3 个答案:

答案 0 :(得分:1)

您必须为搜索提供一些参数。例如,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

WHERE a.user_id in (116, 227, 229, 613, 879)

答案 1 :(得分:1)

我对postgresql的sql语法并不完全熟悉,但试试这个:

select venue_id, COUNT(distinct user_id) from activities Where user_id in (116,227,229,613,879) group by venue_id having COUNT(distinct user_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

答案 2 :(得分:0)

在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)

您需要加入表格,以便获得所有拥有用户活动的场所。当您刚刚学习时,如果使用子查询,有时可以更简单地将其可视化。至少就是我找到的东西。