Rails 3查询:使用’select’和’order’时出错

我试图回答这个问题 ,我得到了这个问题。

我有一个具有idemailfirst_name列的用户模型。 因此,在单个查询中,我想选择具有不同first_name用户,通过email对其进行排序并获取其ID

我怎样才能做到这一点?

什么行不通:

  1. User.select(:first_name).uniq.pluck(:id)

    因为它触发了这个SQL SELECT DISTINCT "users"."id" FROM "users" 。 这是从用户中选择不同的id。 但是我们想要选择不同的first_name

  2. User.order("email DESC").pluck(:id).uniq

    SQL生成: SELECT "users"."id" FROM "users" ORDER BY email DESC 。 这不起作用,因为生成的sql不检查first_name的唯一性。

您可以使用此SQLFIDDLE测试SQL。

只有Sqlite和MySql支持这种用法,但其他人则不支持。

请参阅此postgresql文档 。

在SQL-92标准中,ORDER BY子句只能使用结果列名称或数字

也可以在ORDER BY子句中使用任意表达式,包括未出现在SELECT结果列表中的列。 因此以下声明是有效的:

SELECT name FROM distributor ORDER BY代码;

此function的限制是,应用于UNION,INTERSECT或EXCEPT子句的结果的ORDER BY子句只能指定输出列名称或数字,而不能指定表达式。

对于您的情况,不需要使用uniq,所有用户ID已经不同,所以为什么不试试这个:

 User.order("email DESC").pluck(:id) 

假设id重复,你可以用ruby代替DB。

 User.order("email DESC").pluck(:id).uniq 

这个脚本永远不会生成带有distinct的sql。 采摘后的这个uniq是一个Array#uniq方法。