【问题标题】:How can I avoid duplication in a join query using Sequel with Postgres on Sinatra?如何在 Sinatra 上使用 Sequel 和 Postgres 避免连接查询中的重复?
【发布时间】:2013-12-01 07:39:20
【问题描述】:

我想做一个简单的连接。我有两张桌子:“候选人”和“笔记”。

并非所有候选人都有关于他们的注释,有些候选人有不止一个关于他们的注释。链接字段是候选表中的id 和注释表中的candidate_id。查询是:

people = candidates.where(:industry => industry).where("country = ?", country).left_outer_join(:notes, :candidate_id => :id).order(Sequel.desc(:id)).map do |row|
  {
    :id => row[:id],
    :first => row[:first],
    :last => row[:last],
    :designation => row[:designation],
    :company => row[:company],
    :email => row[:email],
    :remarks => row[:remarks],
    :note => row[:note]
  } 
end

它工作得很好,可以从候选人表中获取所有指定的候选人,并从注释表中获取注释,但是如果有多个注释,它会重复候选人的姓名。在结果列表中,人“abc”出现两次或三次,具体取决于与该人关联的笔记数量。

我实际上并没有在 HTML 结果中打印注释,如果该人有注释,则只是一个“勾号”,如果没有注释,则为“--”。

我希望这个人的名字只出现一次。我尝试在查询中的每个可能的位置添加distinct,但没有任何区别。

有什么想法吗?

【问题讨论】:

    标签: ruby postgresql sinatra sequel


    【解决方案1】:

    为了使 distinct 发挥作用,您需要确保只选择要在其上进行区分的列。您可以尝试将其添加到查询中

    .select(:candidates__id, :first, :last, :designation, :company, :email, :remarks, Sequel.as({:notes=>nil}).as(:notes)).distinct
    

    但是您最好使用子选择而不是连接来检查注释是否存在(假设您使用的是体面的数据库):

    candidates.where(:industry => industry, :country=>country).select_append(Sequel.as({:id=>DB[:notes].select(:candidate_id)}, :note)).order(Sequel.desc(:id)).map do |row|
      { :id => row[:id], :first => row[:first], :last => row[:last], :designation => row[:designation], :company => row[:company], :email => row[:email], :remarks => row[:remarks], :note => row[:note] } 
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2019-08-19
      • 2012-08-03
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多