sql - 根据另一个表中的条件选择一个表中的记录

标签 sql ruby-on-rails-3 postgresql join scope

在我正在处理的 Rails 应用程序中,我有以下设置:

class Volunteer < AR::Base
  has_many :engagements
end

class Engagement < AR::Base
  belongs_to :volunteer
end

我正在尝试选择在特定日期或日期范围之间没有参与的所有志愿者:

scope :not_engaged_on, lambda { |q| joins(:engagements).where(["engagements.date != ?", q])}

scope :not_engaged_between, lambda { |s, e| joins(:engagements).where(["engagements.date NOT BETWEEN ? AND ?", s, e]) }

我将这些范围与其他范围合并以筛选志愿者。

上述范围 :not_engaged_between 产生以下 SQL:

SELECT "volunteers".* FROM "volunteers" INNER JOIN "accounts" ON "accounts"."user_id" = "volunteers"."id" AND "accounts"."user_type" = 'Volunteer' INNER JOIN "engagements" ON "engagements"."volunteer_id" = "volunteers"."id" WHERE (accounts.activation_state = 'active') AND (engagements.date NOT BETWEEN '2012-07-30' AND '2012-08-04')

问题是志愿者可能直到现在还没有任何参与,在这种情况下,查询完全忽略了这些志愿者。即使他们没有任何约定,我如何才能让所有志愿者返回?

最佳答案

@Anthony 已经提到NOT EXISTS。另一个选项是 LEFT [OUTER] JOIN + 检查是否存在(e.volunteer_id IS NULL):


SELECT v.*
FROM   volunteers       v
JOIN   accounts         a ON a.user_id = v.id
<b>LEFT  JOIN engagements e ON e.volunteer_id = v.id
                        AND e.date BETWEEN '2012-07-30' AND '2012-08-04'</b>
WHERE  a.user_type = 'Volunteer'
AND    a.activation_state = 'active'
<b>AND   e.volunteer_id IS NULL</b>;

在这种情况下,您必须将条件 e.date BETWEEN '2012-07-30' AND '2012-08-04' 移动到连接子句。

accounts 使用另一个 LEFT JOIN,如果它也可能丢失的话。但您似乎确实想要检查 user_typeactivation_state

关于sql - 根据另一个表中的条件选择一个表中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11724051/

相关文章:

mysql - 如何显示结果,限制二表和查看时差

sql - 在 SQL Server 中连接列值

ruby-on-rails - Admin::UsersController 中的 ActiveRecord::InvalidForeignKey#destroy

python - Django ORM : How can I sort by date and then select the best of the objects grouped by a foreign key?

django - 分配主键整数范围

mysql - "FIELDS TERMINATED BY"和 "LINES TERMINATED BY"有什么问题?

ruby-on-rails - Rails before_save 方法无法执行 'else' block

ruby-on-rails - Rake 任务启动但在通过 Controller 执行时突然停止

postgresql - 获得与sql语句的第二个区别

sql - 我应该如何将统计数据保存到数据库