我有两个要与之进行内部联接的表。
一个是users主键为的表id。
users
id
另一个表是外键bars在哪里user_id。bars也有一个列foo_id,其中wherefood_id是foos表的外键。
bars
user_id
foo_id
food_id
foos
我正在尝试汇总一个ActiveRecord查询,在这里我可以选择N天前或之前创建的所有用户,并且foos其中任何bars.foo_id一个都没有等于特定ID的用户。我试图做这样的事情:
bars.foo_id
users = User.where("users.created_at <= ?", 50.days.ago).joins(:bars).where("bars.foo_id != 5")
此查询字段超过30,000个结果,这是不正确的,因为Users表仅具有12,000行。
我到底在做什么错?
您弄错了连接数学,并且产生了为每个用户+ foo组合创建行的效果。这是完全联接的工作方式。发生这种滑倒的原因是因为您实际上尚未将bars表加入到users表中。通常情况下,您必须加入条件,就像您的情况一样,bars.user_id=users.id是一个好主意。
bars.user_id=users.id
话虽如此,您要做的是确定哪些用户符合条件,然后加载这些用户:
users = User.where('id IN (SELECT DISTINCT user_id FROM bars WHERE bars.foo_id!=?)', 5)
如果单独运行该子选择,则应该仅返回没有该特定foo的用户列表。使用此作为WHERE条件应仅加载那些用户。
WHERE