小编典典

使用内部联接的Rails ActiveRecord查询

sql

我有两个要与之进行内部联接的表。

一个是users主键为的表id

另一个表是外键bars在哪里user_idbars也有一个列foo_id,其中wherefood_idfoos表的外键。

我正在尝试汇总一个ActiveRecord查询,在这里我可以选择N天前或之前创建的所有用户,并且foos其中任何bars.foo_id一个都没有等于特定ID的用户。我试图做这样的事情:

users = User.where("users.created_at <= ?", 50.days.ago).joins(:bars).where("bars.foo_id != 5")

此查询字段超过30,000个结果,这是不正确的,因为Users表仅具有12,000行。

我到底在做什么错?


阅读 128

收藏
2021-04-28

共1个答案

小编典典

您弄错了连接数学,并且产生了为每个用户+
foo组合创建行的效果。这是完全联接的工作方式。发生这种滑倒的原因是因为您实际上尚未将bars表加入到users表中。通常情况下,您必须加入条件,就像您的情况一样,bars.user_id=users.id是一个好主意。

话虽如此,您要做的是确定哪些用户符合条件,然后加载这些用户:

users = User.where('id IN (SELECT DISTINCT user_id FROM bars WHERE bars.foo_id!=?)', 5)

如果单独运行该子选择,则应该仅返回没有该特定foo的用户列表。使用此作为WHERE条件应仅加载那些用户。

2021-04-28