我正在为我的大学开发一个项目,使用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
答案 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)
您需要加入表格,以便获得所有拥有用户活动的场所。当您刚刚学习时,如果使用子查询,有时可以更简单地将其可视化。至少就是我找到的东西。