【问题标题】:Rails "nested" join queryRails“嵌套”连接查询
【发布时间】:2013-04-03 04:28:51
【问题描述】:

在我的数据库中,我有以下表格和关系:

检查 --has_many--< 样品 --has_many--< 结果

如果一个样本有一个或多个与之相关的结果,则该样本被视为“已分析”。如果对所有样品进行了分析,则检查被认为是“完整的”。我需要找到所有“不完整”的检查;也就是说,所有检查中至少有一个样本未被分析。

我在 mysql 数据库中执行此操作的查询是

SELECT DISTINCT inspections.*
    FROM inspections
    JOIN samples s ON inspections.id = s.inspection_id
    LEFT OUTER JOIN results r ON r.`sample_id` = s.`id`
    WHERE r.id IS NULL

我正在尝试将其转换为一个不错的 ActiveRecord find 调用(find_by_sql 除外),但我不确定如何将“嵌套”关联(术语?)的左连接转换为语法。

谁能帮帮我?顺便说一句,这是针对 Rails 2.3 应用程序的。


现在我有

Inspection.all(:select => "distinct inspections.*",
  :joins => "join samples on samples.inspection_id = inspections.id " +
    "left join results on results.sample_id = samples.id",
  :conditions => "results.id is null")

它可以工作,但看起来仍然很粗糙并且太接近整个 sql 语句。还有比这更干净的东西吗?

【问题讨论】:

    标签: ruby-on-rails activerecord syntax


    【解决方案1】:

    在查找语句中使用:include:

    Inspection.find(:all, :include => {:samples => :results})
    

    编辑:

    我之前错过了INNER JOIN 和LEFT JOIN 的组合。我很抱歉。

    虽然它不会生成相同的查询,但您可以添加额外的 where 检查以过滤掉没有任何样本的检查。

    Inspection.find(:all,
        :select => "DISTINCT inspections.*",
        :include => {:samples => :results},
        :conditions => "results.id IS NULL AND samples.id IS NOT NULL")
    

    但请注意,这种方法的执行效果不如JOINs。

    【讨论】:

    • 不完全。如果我包含 :conditions => "results.id is null" 以匹配 SQL 查询,它几乎可以工作,但它包括没有样本的检查。我需要排除这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2021-11-23
    • 1970-01-01
    • 2017-02-12
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多