SQL 查询过滤记录
Posted
技术标签:
【中文标题】SQL 查询过滤记录【英文标题】:SQL Query filtering records 【发布时间】:2014-09-03 18:02:24 【问题描述】:我正在处理一个查询以显示未授予的职位报价 (awarded: false
)。
下面的代码运行良好,但我有其他 Jobquotes 被授予 (awarded: true
) 具有相同的 job.id。我想知道是否有一种方法可以过滤结果以删除具有相同 job.id 的任何 Jobquotes,其中一个被授予。
awarded
在职位引用中
x = Jobquote.select('*, (total_cost/quote_qty) AS cost_each')
.includes(job: [:part], quote: [:vendor])
.where(awarded: false)
.where.not("quotes.quote_number" => nil)
.order("parts.number, cost_each")
.group(:quote_id, "parts.number")
【问题讨论】:
请注意,where(awarded: false)
是一种更通用的表达方式。 'f'
是 Postgres 特有的。
谢谢@tadman,已经更正了
在我看来,Job
应该是基于Jobquote
的awarded
。这将使上述逻辑更简单,因为您只能选择不是awarded
的作业。你有什么类型的标志吗?
该作业有很多引号,因此有一个作业引号连接表。因此,该工作的具体报价将被授予。
awarded
是Quote
的一部分还是Jobquote
的一部分?
【参考方案1】:
您可以尝试这样的事情:(请注意,我觉得有更好的方法可以做到这一点,只是现在想不出任何东西)
class Jobquote < ActiveRecord::Base
belongs_to :job
belongs_to :quote
scope :awarded_job_quotes, -> where(awarded: true)
scope :open_job_quotes, ->
awarded_job_ids = awarded_job_quotes.pluck(:job_id)
where.not(job_id: awarded_job_ids)
scope :display_open_job_quotes, ->
open_job_quotes.select('*, (total_cost/quote_qty) AS cost_each')
.includes(job: [:part], quote: [:vendor])
.where.not("quotes.quote_number" => nil)
.order("parts.number, cost_each")
.group(:quote_id, "parts.number")
end
然后你可以调用为
Jobquote.display_open_job_quotes
这将查找所有已授予的工作,然后将它们从job_id
的查询中排除。然后我创建了一个 scope
(display_open_job_quotes
) 来返回请求的数据,因为我觉得像这样的长查询链可能会分散控制器的注意力。
注意:这将运行一个额外的查询来获取初始的job_ids
。
【讨论】:
我不得不承认我对你的注:有点困惑 @Beengie 现在您正在运行单个查询。此解决方案将运行初始查询以收集所有已授予的job_ids
,然后仅获取job_id
并在事后运行您的查询。这会创建 2 个查询,第一个是 job_ids
,然后是你的。当我以一种可能会改变性能的方式改变程序时,我总是喜欢指出,即使它本质上是轻微的。
我不确定您是否说我需要为 job_ids 添加另一个查询,而不是 open_job_quotes
... 正在测试...
@Beengie 我可以理解我将笔记的措辞更改为更加清晰的困惑。
我添加了.select('*, (total_cost/quote_qty) AS cost_each')
,非常完美。感谢多层次的教育。以上是关于SQL 查询过滤记录的主要内容,如果未能解决你的问题,请参考以下文章
SQL 查询 - 如何按 null 或不为 null 进行过滤
查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?