Rails 3查询:使用’select’和’order’时出错
我试图回答这个问题 ,我得到了这个问题。
我有一个具有id
, email
和first_name
列的用户模型。 因此,在单个查询中,我想选择具有不同first_name
用户,通过email
对其进行排序并获取其ID
。
我怎样才能做到这一点?
什么行不通:
-
User.select(:first_name).uniq.pluck(:id)
因为它触发了这个SQL
SELECT DISTINCT "users"."id" FROM "users"
。 这是从用户中选择不同的id。 但是我们想要选择不同的first_name -
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
方法。