我们列出了具有重复名称的类别产品。 如何获得Postgres中不应该有重复产品名称的产品列表?
我们正在寻找具有分组名称的最小产品ID。 然后在ids中搜索产品。
category = Category.first
ids = Product.select("MIN(id) as id").where(deleted: false).group(:name).collect(&:id)
category.products.where("products.id IN (?)", ids).find_active
我们如何优化查询?
答案 0 :(得分:0)
您可以使用Product.all.pluck(:name).uniq来获取数组中的产品名称。
但我认为你正在解决错误的问题,因为这个问题有一个糟糕的“气味”。如果您的产品具有相同的名称,那么您如何将它们与用户体验视角区分开来?为什么只能通过该名称获得第一个创建的产品而不是最受欢迎的产品?我试图想象这个解决方案对于用户是如何起作用的,而且我是空白的,也许是因为我对上下文不够了解。
编辑另外,您能否澄清“不应该有重复的产品名称”的含义?它是获取产品列表,但只有第一个产品,如果有多个产品具有相同的名称?或者您正在寻找要纠正的项目吗?
答案 1 :(得分:0)
Postgres中的简单解决方案是使用DISTINCT ON
:
SELECT DISTINCT ON (name)
id, name -- add more columns if you need
FROM Product
WHERE deleted = FALSE
ORDER BY name, id;
返回唯一的产品名称(按字母顺序排序)。从每组欺骗中,id
最小。详细说明: