假设我试着计算一段时间内每个部门的事故数.所以我有两张桌子.我正在try 使用ActiveRecord获取我的答案,结果如下所示

class Division < ApplicationRecord
  has_many :accidents

end

class Accident < ApplicationRecord
  belongs_to :division

end


Division.left_joins(:accidents).where('accidents.occurred_at > ?', Time.now - 1.year).group(:name).count

在本例中,ActiveRecord生成该SQL

SELECT COUNT(accidents.id) AS "count_all", "divisions"."name" AS "divisions_name"
FROM "divisions"
LEFT OUTER JOIN "accidents" ON "accidents"."division_id" = "divisions"."id"
WHERE (accidents.occurred_at > '2022-07-30 20:56:10.178153')
GROUP BY "divisions"."name"

这里的问题是,如果某些部门的意外计数为0,我们将不会在查询结果中看到它,所以我需要SQL是这样的

SELECT COUNT(accidents.id) AS "count_all", "divisions"."name" AS "divisions_name"
FROM "divisions"
LEFT OUTER JOIN "accidents" ON "accidents"."division_id" = "divisions"."id" and accidents.occurred_at > '2022-07-30 20:56:10.178153'
GROUP BY "divisions"."name"

是否可以为JOIN指定一些附加条件? 我知道我们可以为HAS_MANY关系指定其他条件,但这将是静态条件.我希望它是动态的,具体取决于用户请求参数

我正在try 避免将原始SQL用于连接条件E.Q.

Division.joins("LEFT OUTER JOIN accidents ON accidents.division_id = divisions.id
and (accidents.occurred_at > '2022-07-30 20:56:10.178153'").group(:name).count('accidents.id')

推荐答案

使用Scope和JOIN来简化最终查询怎么样?

class Division < ApplicationRecord
  scope :with_accidents_from, ->(occurred_at) do
    joins_query =
      sanitize_sql([
        'LEFT OUTER JOIN accidents ON accidents.division_id = divisions.id AND accidents.occurred_at > ?',
        occurred_at
      ])

    joins(joins_query)
  end
end

然后

Division.with_accidents_from(1.year.ago).group(:name).count('accidents.id')

Sql相关问答推荐

如何根据给定条件PostgreSQL迭代减少组中的行数

将重复的值更新为下一个空闲数字

SQL Select 最小优先级

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

组合2个分区表的postgres视图的执行计划正在访问所有分区

在SQL查询中查找客户端的最短日期比较列和多行

如何使用聚合连接两个表

替换SQL Server XML中多处出现的 node 值

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

Clickhouse:左连接表到外部数组

正则表达式:停在第一个匹配的其中一个字符位置上

IN子句使用的表值用户定义函数参数

将表格和字符串连接以 for each 记录生成订单项目

在给定的日期范围内填写缺失的日期

在 SQL 查询中创建滚动日期

添加一列并根据其他列值进行填充

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

如果当前日期是一周中的某一天,则从另一天提取结果

如何在 Trino/Presto 中过滤掉 map 中的某些键?

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用