【问题标题】:Return distinct/unique records of join table返回连接表的不同/唯一记录
【发布时间】:2019-01-25 00:37:51
【问题描述】:

我已加入多个表来构建我的记录,如下所示,但现在我想返回未分配给term_year_id 301 的唯一标准(即我想返回standard_id 1 and 4)。

id   standard_id   term_id     term_year_id
 1        1          200            300
 2        2          200            300
 3        2          201            301
 4        3          202            300

我试图返回不等于term_year_id 301 的记录,但那会返回我不想要的standard 2。我也尝试过 group/have 但我的语法错误?

def school_standards
  @standards = @school.achievement_standards
  .joins("LEFT OUTER JOIN term_standards ON achievement_standards.id = term_standards.achievement_standard_id")
  .joins("LEFT OUTER JOIN terms ON terms.id = term_standards.term_id")
  .group("terms.term_year_id")
  .having("terms.term_year_id <> 301)

end

这样做的正确方法是什么?我正在使用带有 postgres 的 Rails。

【问题讨论】:

  • 哦!您想返回所有不包括 term_year_id 301 的标准 ID。您可能需要告诉我们您使用的是哪个数据库。
  • 但我不想返回standard_id 2,因为它在term_year_id 300 and 301
  • 我正在使用带有 rails 的 postgres
  • 那么我认为你要做的是一个 group().having() ,你的 group by 进入一个数组,而你的 having 不包括 301。stackoverflow.com/questions/10928210/postgresql-aggregate-array postgresql.org/docs/9.1/functions-array.html跨度>
  • 对连接表进行分组的语法是什么?我收到column must appear in GROUP BY clause 之类的错误。注意:我将代码添加到问题中

标签: sql ruby-on-rails


【解决方案1】:

您似乎可以获得一个唯一的 standard_id 列表,其中 term_year_id 等于 301,然后将它们踢出。像下面这样的东西应该可以工作:

select a.*
from myTable a
where standard_id not in (select distinct standard_id from myTable where term_year_id = 301)

【讨论】:

  • 你能分享一下如何在 Rails 中做到这一点吗?
【解决方案2】:

给定上面的表格,以及表格“Stt”的模型(Standard Term Term_year)

  def test_the_ticket
    rows = [
      {standard_id: 1, term_id: 200, term_year_id: 300},
      {standard_id: 2, term_id: 200, term_year_id: 300},
      {standard_id: 2, term_id: 201, term_year_id: 301},
      {standard_id: 3, term_id: 202, term_year_id: 300}
    ]
    Stt.create! rows
    results = Stt.select(:standard_id, 'array_agg(term_year_id) as term_year_ids').group('standard_id').having('NOT array_agg(term_year_id) @> Array[301]')
    assert_equal([1,3], results.map(&:standard_id))
  end

可能有更好/更漂亮的方法,但这会做。

  Stt Load (1.8ms)  SELECT "stts"."standard_id", array_agg(term_year_id) as term_year_ids FROM "stts" GROUP BY "stts"."standard_id" HAVING (NOT array_agg(term_year_id) @> Array[301])

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2011-03-27
    • 2011-07-11
    相关资源
    最近更新 更多