【发布时间】:2012-05-27 16:23:58
【问题描述】:
我正在尝试在我的数据库中查询与当前查看的记录(基于标记)相似的记录,但我想随机化顺序。
我的开发环境是mysql,所以我会这样做:
@tattoos = Tattoo.tagged_with(tags, :any => true).order("RAND()").limit(6)
可行,但我的生产环境是使用 postgresql 的 heroku,所以我尝试使用它:
@tattoos = Tattoo.tagged_with(tags, :any => true).order("RANDOM()").limit(6)
但我收到以下错误:
ActionView::Template::Error (PGError: ERROR: for SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中
SELECT DISTINCT tattoos.* FROM "tattoos" JOIN taggings
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477 ON
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.taggable_id = tattoos.id AND
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.taggable_type = 'Tattoo' WHERE
(tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.tag_id = 3 OR
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.tag_id = 4 OR
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.tag_id = 5 OR
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.tag_id = 24 OR
tattoos_taggings_color_fantasy_newschool_nerdy_tv_477.tag_id = 205) ORDER BY RANDOM() LIMIT 6):
【问题讨论】:
-
快速评论一下,对于超过几千行的数据集,按 random() 限制 x 排序是非常低效的。以至于一旦你有 10k 到 1M 行,它就会变得太慢而无法接受。
标签: ruby-on-rails ruby-on-rails-3 postgresql heroku