【问题标题】:Random order with distinct column具有不同列的随机顺序
【发布时间】:2015-06-27 05:34:29
【问题描述】:

我正在创建一个涉及多个连接的查询,这会导致一些重复

@users = User.joins(...).where(...).select("users.id")

根据该结果,我想记录distinctRANDOM() 顺序

我似乎无法用 activerecord 重新创建它。

使用 SQL 它看起来像

SELECT DISTINCT users.*
from ( long complex query)
ORDER BY RANDOM()

【问题讨论】:

  • 我并没有抓住所有用户,并且我在之后限制了查询。洗牌会非常慢。我想要的只是通过带有 setseed 的 RANDOM() 进行排序,但是我要么得到重复,要么得到一个错误,说如果我不选择随机列,我就不能随机排序。选择 random() 列使该行不明显...
  • 是的,但这需要我选择 RANDOM() 列按它排序,这会使其不明显

标签: sql ruby-on-rails postgresql ruby-on-rails-4 activerecord


【解决方案1】:

与在任何框架中构建复杂查询相比,最简单的事情之一是使用标准 SQL 构建复杂查询,然后将其包装在视图中:

CREATE VIEW complex_stuff AS
  SELECT DISTINCT users.*
  FROM ( long complex query)
  ORDER BY RANDOM();

视图变成一个简单的实体或类,您可以从中提取所需的列,可能按某些列 (SELECT a, b, c FROM complex_stuff WHERE d = ?) 进行过滤。

【讨论】:

  • 不熟悉 SQL 中的 VIEW 或者是否可以使用 activerecord。你能给我链接一些关于这个的东西吗?
  • 视图就像存储的SELECT 语句。您可以像使用任何其他表格一样使用它。实际上,您只需设计一次复杂的查询,然后重复使用它。它比在 ror 中执行此操作要高效得多,因为查询计划存储在 PostgreSQL 中。你可以阅读here的观点。
  • 此外,您的 ror 代码将变得更加简洁和易于维护。一般来说,你应该让 PostgreSQL 做它的设计:存储数据并在可能复杂的查询中处理它,并在它擅长的地方使用 Ruby:向用户呈现数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多