【问题标题】:SQL query for mutual visited places相互访问的地方的SQL查询
【发布时间】:2011-04-27 20:17:25
【问题描述】:

我正在使用 Rails 3/PostgreSQL 为我的大学开展一个项目,其中我们有用户、活动和场地。一个用户有很多活动,一个场所有很多活动。一个活动属于一个用户和一个场所,因此有一个 user_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

但现在我需要一种方法来找出共同的场所。 有什么想法吗?

谢谢, 晚礼服

【问题讨论】:

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


    【解决方案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 场地_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

    输出是:

    场地_id ------------ ------------ 2 5

    【讨论】:

    • 谢谢你的回答,它解决了!正如我在 Adrian 帖子的评论中所写,您将获得声誉积分;)
    【解决方案2】:

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

    【讨论】:

    • thx,解决了这个问题(顺便说一句难以置信的快速回答;),下面的 M.R. 也以几乎相同的方式解决了它。他得到了声誉,因为你有更多;)对不起!
    • 但是,你应该知道,有些人可能会因此而气馁:)
    • 对此我很抱歉。而且我还尝试将两个帖子都标记为答案,但这不起作用。但是感谢您的帮助!像你(和 M.R.)这样的人是我如此热爱这个社区的原因! ;)
    【解决方案3】:

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

    您需要连接您的表格,以便获得所有有活动且有用户的场所。当您刚刚学习时,如果使用子查询,有时更容易将其可视化。至少这是我为我找到的。

    【讨论】:

    • 抱歉,这不起作用。你的查询有错误,应该是FROM venues AS v。我得到了用户拥有的所有场所,但不是他们共有的场所。
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2011-03-19
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多