1

我正在尝试使用 ActiveRecord 和/或 SQL 来寻找补充。

我有一个“注释”集合,每个注释都有两个相关字段:

  • session_datum_id 对应于执行注释的用户。Null 表示尚未完成。
  • post_id 表示注释为“关于”的帖子。不能为空。

每个 post_id 可能有多个注释。

我想有效地找到满足两个约束的注释:

  1. session_datum_id 为空。这意味着尚未执行此特定注释。
  2. 作为 arg 传入的 session_datum 尚未执行具有相同 post_id 的另一个注释。

这是一个非常幼稚的版本,它在数据库之外进行连接。它会找到该用户已经执行的所有注释,并从仍然需要执行的完整注释列表中删除这些 post_id。然后它从结果列表中随机选择:

def self.random_empty_unseen(session_datum)
  mine = where('session_datum_id = ?', session_datum)
  elligible = where('session_datum_id IS NULL')
  mine.each do |i|
    elligible.each do |j|
      if (i.post_id == j.post_id)
        elligible.delete(j)
      end
    end
  end
  elligible[rand(elligible.count)]
end

随着注释列表变大,这将陷入困境。我可以想象一个概率算法,我们随机选择一个符合条件的注释,然后检查用户是否已经执行了它(如果是,则重试),但在某些退化的情况下它不起作用。(大量注释,用户执行了所有注释,但其中一个除外。)

是否有对此的封闭式查询,可能使用 NOT EXISTS?

4

1 回答 1

1
SELECT a1.*
FROM annotations AS a1
JOIN annotations AS a2
ON a1.post_id=a2.post_id
WHERE a2.session_datum_id=session_datum AND a1.session_datum_id IS NULL
于 2012-03-10T04:26:55.467 回答