我正在使用Rails 3和postgresql。我有以下类型:摇滚,氛围,另类,房子。
我还注册了两个用户。一个有摇滚,另一个 house ,作为他们的流派。我需要回归摇滚和房屋类型的物体。
我找到了两种方法来做到这一点。一个是使用组:
Genre.group('genres.id, genres.name, genres.cached_slug, genres.created_at, genres.updated_at').joins(:user).all
另一个使用DISTINCT:
Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user)
两者都返回相同的预期结果。但哪一个更好的表现明智?使用group()看起来很乱,因为我必须指出Genre表中的所有字段,否则我会得到错误:
ActiveRecord::StatementInvalid: PGError: ERROR: column "genres.id" must appear in the GROUP BY clause or be used in an aggregate function
: SELECT genres.id FROM "genres" INNER JOIN "users" ON "users"."genre_id" = "genres"."id" GROUP BY genres.name
答案 0 :(得分:1)
DISTINCT
和GROUP BY
通常会生成相同的查询计划,因此两种查询结构的性能应该相同。
由于你没有使用任何聚合函数,你应该使用在你的情况下最有意义的函数,我相信这是一个:
Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user)
在尝试稍后阅读您的代码时会更清楚,并记住您在此处所做的事情,正如您所指出的那样,它不那么混乱。
<强>更新强>
这取决于您使用的Postgresql的版本。使用版本&lt; 8.4,GROUP BY
更快。对于8.4及更高版本,它们是相同的。