我正在为我的大学用Rails 3/PostgreSQL做一个项目,在那里我们有用户,活动和场地。用户有许多活动,场地也有许多活动。一个活动属于一个用户和一个场地,因此有一个user_id和一个venue_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
但现在我需要一种方法来找到共同的场所。任何想法?
谢谢,晚礼服
我不太熟悉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 12 6 23 3 34 4 45 5 51 2 62 2 73 2 84 2 95 2 10之前输出为:
<>之前venue_id----------- -----------2 5您必须为您的搜索提出一些参数。例如,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)
在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)
你需要把你的表连接起来,以便得到所有有过活动的场所。当你刚刚学习的时候,如果你使用子查询,有时会更容易可视化。