23

所以这更像是一个问题,但这就是我想要做的。

我有三个对象可以说,称为项目

<Item id: 1, name: 'Book'>
<Item id: 2, name: 'Car'>
<Item id: 3, name: 'Book'>

我想做一个只返回每个唯一“名称”属性之一的查询。

就像是Item.select('distinct(name), items.*')

但这不起作用,它仍然返回所有三个项目。

我怎样才能形成这个查询,以便它只返回:

<Item id: 1, name: 'Book'>
<Item id: 2, name: 'Car'>
4

6 回答 6

35

如果你想取回整个模型,但仍然保持唯一性,你可以使用这个:

Item.select('distinct on (name) *')

我只用 Postgres 数据库对此进行了测试。它可能适用于mysql,也可能不适用于mysql。

于 2015-06-01T03:09:03.750 回答
11

请试试这个:

Item.select('distinct name')
于 2013-08-05T03:51:01.947 回答
4

如果您只需要一个包含名称的数组,而没有 ID,您可以执行以下操作:

Item.pluck(:name).uniq

SQL查询结果:

#=> SELECT `items`.`name` FROM `items`

** 编辑 **

uniq记录数组上运行。如果您期望有很多记录,请小心。SQL Distinct 要快得多。

如果是这样,请使用上面 vee 的答案,并带有map

Item.select('distinct name').map(:name)

于 2015-01-11T17:24:27.780 回答
3

我还不能对帖子发表评论,因此,将其作为该问题的另一个答案。

如果有人仍在搜索这个,@BananaNeil 的答案是正确的。但是,放入distinctselect我不起作用(Rails 5.2.2)。将这两者分开确实解决了我的问题。

klass.where(
  # Your query or whatever
).distinct.select('on (attribute) *')
于 2019-03-07T10:42:29.527 回答
0

在 Rails 4 中尝试Items.all.to_a.uniq { |item| item.name }

在 Rails 3 中你应该能够做到Items.uniq_by { |item| item.name }

当你调用uniq一个数组时,你可以向它传递一个块来指示如何确定唯一性。在 Rails 3 中,您曾经可以使用uniq_by,但在 Rails 4 中已弃用它。所以我发现的一种方法是将 ActiveRecord Relation 转换为数组并调用uniq它。

于 2014-03-14T01:32:29.973 回答
0

对于 Mysql,您可以group在 禁用ONLY_FULL_GROUP_BY的情况下使用,

Item.group(:name).to_sql
=> "SELECT `items`.* FROM `items`  GROUP BY name"

请参阅mysql 5.6 是否有 ANY_VALUE 功能?

于 2017-11-28T09:46:13.453 回答