当前位置: 首页 > 知识库问答 >
问题:

查找连接不存在的记录

齐奕
2023-03-14

我可以通过用户是否投票来限制所有问题。在模型中:

scope :answered_by, lambda {|u| joins(:votes).where("votes.user_id = ?", u.id) }
scope :unanswered_by, lambda {|u| joins(:votes).where("votes.user_id != ?", u.id) }

在控制器中,我这样称呼他们:

@answered = Question.answered_by(current_user)
@unanswered = Question.unanswered_by(current_user)

作用域未应答的\u不正确。我基本上是想找到没有投票权的地方。相反,它试图寻找是否有不等于当前用户的投票。有没有办法返回不存在连接的所有记录?

共有3个答案

陆光济
2023-03-14

如果您想以优雅和Rails式的方式进行EXISTS查询,您可以使用我编写的“存在的地方”gem:

Question.where_not_exists(:votes, user_id: current_user.id)

当然,您也可以创建它的范围:

scope :unanswered_by, ->(user){ where_not_exists(:votes, user_id: user.id) }
翟宾实
2023-03-14

试试这个,让我知道它是否有效

编辑-1

scope :unanswered_questions, lambda { joins('LEFT OUTER JOIN votes ON questions.id = votes.question_id').where('votes.question_id IS NULL') }

编辑-2

scope :unanswered_by, lambda {|u| where("questions.id NOT IN (SELECT votes.question_id from votes where votes.user_id = ?)",u.id) }
仇浩旷
2023-03-14

使用EXISTS表达式:

WHERE NOT EXISTS (
   SELECT FROM votes v  -- SELECT list can be empty
   WHERE  v.some_id = base_table.some_id
   AND    v.user_id = ?
   )

...在NOTEXISTS()()和NOTIN()()之间有两个方面:

>

  • 性能

    通常更快。一旦找到第一个匹配项,它就会停止处理子查询。手册:

    子查询通常只执行足够长的时间来确定是否至少返回一行,而不是一直执行到完成。

    Ⓘ 也可以由查询计划器进行优化,但优化程度较低,因为处理使其更加复杂。

    正确性

    如果子查询表达式中的结果值之一为NULL,则Ⓘ 为空,而公共逻辑预期为真Ⓔ 将返回TRUE。手册:

    如果所有每行结果都不相等或为null,且至少有一个为null,则非IN的结果为null。

    本质上,(Not)EXISTS在大多数情况下是更好的选择。

    您的查询可以如下所示:

    SELECT *
    FROM   questions q
    WHERE  NOT EXISTS (
        SELECT FROM votes v 
        WHERE  v.question_id = q.id
        AND    v.user_id = ?
        );
    

    不要加入基本查询中的投票。这将使努力无效。

    除了不存在不在之外,还有其他语法选项,其中左连接/为空除外。请参见:

    • 选择其他表中不存在的行

  •  类似资料:
    • 问题内容: 想象两个表(A和B): 现在,我想从A中删除B中不存在的记录,例如,从A中删除1、6和4。 我最初的想法是,您可以“否定”联接的结果。 问题答案: 我假设这些列被命名为。

    • 问题内容: 我有以下两个表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或(感谢WOPR) (忽略这一点,正如其他人所说的那样,通常最好只选择所需的列,而不是’ ‘)

    • 问题内容: 我有以下两个SQL表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 任何帮助将非常感激。 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或者(由于Alterlife) 或(感谢WOPR) (如其他人所说,忽略它通常最好只选择想要的列

    • 问题内容: 我需要查找连接到给定计算机的所有可写存储设备, 无论 它们 是否 已安装。 最糟糕的方法是 尝试与可写设备()相对应的每个条目。 有更好的解决方案,还是我应该坚持呢? 问题答案: 将列出系统可识别的所有块设备和分区。然后,您可以尝试使用来确定分区上存在的文件系统类型(如果有)。

    • 问题内容: 如何使用Javascript检查互联网连接?这样,我可以有一些条件说“在生产过程中使用Google缓存的JQuery版本,在开发过程中使用该版本或本地版本,具体取决于Internet连接”。 问题答案: 针对您的特定情况的最佳选择可能是: 在您的结束标记之前: 鉴于您的问题集中在jQuery上,这可能是最简单的方法。 如果您想要一个更强大的解决方案,可以尝试: 阅读有关W3C在脱机We