ruby-on-rails 合并SQL中除最后一列外完全相同的行,从而压缩结果中的唯一值

zdwk9cvp  于 2023-05-02  发布在  Ruby
关注(0)|答案(2)|浏览(137)

想象一下,我拥有一家宠物店,并有客户和宠物表。
如果我做了一个类似的查询

SELECT
CUSTOMER.ID,
CUSTOMER.NAME,
CUSTOMER.EMAIL,
PET.NAME
FROM CUSTOMERS
INNER JOIN PETS ON PET.CUSTOMER_ID = CUSTOMER.ID

我应该得到的结果是

[1, 'John Doe', 'johndoe@jd.com', 'Bailey']

但如果我有多个宠物的客户,这意味着我会得到多行:

[1, 'John Doe', 'johndoe@jd.com', 'Bailey'],
[1, 'John Doe', 'johndoe@jd.com', 'Luna']

有没有一种方法可以压缩这些行,同时保留唯一的值?我怎么能得到这样的结果

[1, 'John Doe', 'johndoe@jd.com', ['Bailey', 'Luna']]


我试图选择不同的客户ID,但我认为只有当这是唯一的领域,你选择?当我添加要选择的其余字段时,仍然会得到重复的行

8aqjt8rx

8aqjt8rx1#

你可以使用string_agg函数来得到你想要的结果-

SELECT c.ID, c.NAME, c.EMAIL,
       STRING_AGG(p.NAME, ',')
  FROM CUSTOMERS c
 INNER JOIN PETS p ON p.CUSTOMER_ID = c.ID
 GROUP BY c.ID, c.NAME, c.EMAIL;
wlwcrazw

wlwcrazw2#

class Customer < ApplicationRecord
  has_many :pets
end
class Pet < ApplicationRecord
  belongs_to :customer
end
Customer.group(:id)
        .joins(:pets)
        .pluck(
          :id,
          :name,
          "JSON_ARRAYAGG(pets.name)"
        )

我还没有使用Oracle适配器的ActiveRecord,所以YMMV。

相关问题