1

我正在尝试对字段不等于特定值的结果进行计数,但它总是无法返回结果。

例如,假设CompanyProducts一对多的关系,我可能会通过查询从 ActiveRecord 中获取以下数组Company.find(63).products(这将是 SQL 的等价物SELECT "products".* FROM "products" WHERE "products"."company_id" = 63;):

<Product id: 1, company_id: 63, foo_id: 1>,
<Product id: 2, company_id: 63, foo_id: 3>,
<Product id: 3, company_id: 63, foo_id: nil>, 
<Product id: 4, company_id: 63, foo_id: nil>

但是,如果我尝试扩展上述查询以计算除第一条记录之外的所有内容,如下所示:

Company.find(63).products.where("foo_id != ?", 1).count

在 SQL 中是:

SELECT COUNT(*) FROM "products" WHERE "products"."company_id" = 63 AND (foo_id != 1)

当我期望看到3时,我似乎总是得到1结果。为什么会发生这种情况,我怎样才能让它正确计数?

4

3 回答 3

1

如果你说你应该得到 1 而不是 0。你正在寻找的是DISTINCT FROMas=!=null 类型都返回 unknown 作为结果。

SELECT COUNT(*) FROM 
products 
WHERE products.company_id = 63 AND (foo_id IS DISTINCT FROM 1)

http://sqlfiddle.com/#!1/8b7a0/3

至于进一步的信息。DISTINCT FROM是 PostgreSQL 独有的,所以这样做的标准版本是:

SELECT COUNT(*) FROM 
products
WHERE products.company_id = 63 AND (foo_id<>1 OR foo_id IS NULL)
于 2013-03-06T21:58:07.907 回答
0

你试过用<>instaed of!=

<>
于 2013-03-06T21:48:37.380 回答
0
Company.find(63).products.where("foo_id != ?", 1).count

应该

Company.find(63).products.where("foo_id <> ?", 1).count

但你应该更进一步:

class Product
  def self.not_foo(foo_id)
    where("foo_id <> ?", foo_id)
  end
end

现在

 Company.find(63).products.not_foo(1).count
于 2013-03-06T21:51:20.163 回答