首页 > 解决方案 > 查找包含确切三个孩子的记录

问题描述

所以我们有games一张桌子,里面有很多participants. 每个参与者都有一个user_id专栏。现在我们需要为一组特定的参与者找到一个游戏。

我的意思是拥有一组 id (1,2,3),我们需要找到一个游戏,其中参与者就是这三个用户,不多也不少。我正在使用活动记录,我尝试了类似的东西:

Game.joins(:participants).where("user_id in (?)", [1,2,3])

但它会返回至少有一个给定用户的所有游戏。

标签: sqljoinactiverecord

解决方案


在 SQL 中,您可以使用group byand having

select g.games_id
from games g
group by g.games_id
having count(*) = sum(case when user_id in (1, 2, 3) then 1 else 0 end) and
       count(*) = 3;  -- number of users in list

第一个条件检查是否所有仅指定的用户都在参与者中。第二个检查是否包括所有用户。


推荐阅读