Rails 加入 returns 的查询结果比应有的少
Rails query with join returns less results than should
为什么我的查询return只有34条记录,但是有300多条记录到return?
查询 1:
2.1.5 :109 > Refinery::BeerBrands::BeerBrand.all.count
(0.5ms) SELECT COUNT(*) FROM `refinery_beer_brands`
=> 34
查询 2:
2.1.5 :106 > Refinery::BeerBrands::BeerBrand.joins(:brewery).count
(0.2ms) SELECT COUNT(*) FROM `refinery_beer_brands` brewery
=> 34
查询 3:
2.1.5 :112 > ::Refinery::Breweries::Brewery.all.count
(0.3ms) SELECT COUNT(*) FROM `refinery_breweries`
=> 303
查询 4:
2.1.5 :111 > ::Refinery::Breweries::Brewery.joins(:beer_brands).count
(1.0ms) SELECT COUNT(*) FROM `refinery_breweries` INNER JOIN `refinery_beer_brands` ON `refinery_beer_brands`.`brewery_id` = `refinery_breweries`.`id`
=> 34
查询 5:
2.1.5 :126 > ::Refinery::Breweries::Brewery.joins(:beer_brands).where(:refinery_beer_brands => { beer_type: [0,1,2,3,4,5] } ).count
(1.1ms) SELECT COUNT(*) FROM `refinery_breweries` INNER JOIN `refinery_beer_brands` ON `refinery_beer_brands`.`brewery_id` = `refinery_breweries`.`id` WHERE `refinery_beer_brands`.`beer_type` IN (0, 1, 2, 3, 4, 5)
=> 34
为什么"query 5" returns只有34条记录?所有 "beer_brands" 必须选择 "beer_type",并且它在数据库编号 0-5 中。我要return303条记录。每个啤酒厂都有很多 beer_brands.
啤酒厂模型:
has_many :beer_brands, :class_name => '::Refinery::BeerBrands::BeerBrand'
啤酒品牌型号:
belongs_to :brewery,:class_name => '::Refinery::Breweries::Brewery'
如何获取相似查询的全部304条记录?我想在查询中过滤具有不同数组的记录。
//编辑 16.3.2015:
好的,你是对的...但我还有一个问题。这个案例呢:
1)啤酒厂可以有啤酒品牌,但不一定要有
2) 我想在啤酒厂名称或其相关啤酒品牌名称中进行全文搜索
现在我的查询如下所示:
out.includes(:beer_brands).where("refinery_breweries.title LIKE ? OR refinery_beer_brands.title LIKE ?", "%#{pars[:query]}%", "%#{pars[:query]}%")"
现在它抛出错误:
Unknown column 'refinery_beer_brands' in 'where clause'
您的查询 1 和 2 显示您在啤酒品牌中只有 34 条记录,这意味着只有少数啤酒厂拥有啤酒品牌,而不是全部 303 个,这就是它仅返回 34 条记录的原因。如果您仍然需要所有 303 记录,请使用 left outer join
或 right outer join
。但是您显然会得到其他啤酒厂的空值。
为什么我的查询return只有34条记录,但是有300多条记录到return?
查询 1:
2.1.5 :109 > Refinery::BeerBrands::BeerBrand.all.count
(0.5ms) SELECT COUNT(*) FROM `refinery_beer_brands`
=> 34
查询 2:
2.1.5 :106 > Refinery::BeerBrands::BeerBrand.joins(:brewery).count
(0.2ms) SELECT COUNT(*) FROM `refinery_beer_brands` brewery
=> 34
查询 3:
2.1.5 :112 > ::Refinery::Breweries::Brewery.all.count
(0.3ms) SELECT COUNT(*) FROM `refinery_breweries`
=> 303
查询 4:
2.1.5 :111 > ::Refinery::Breweries::Brewery.joins(:beer_brands).count
(1.0ms) SELECT COUNT(*) FROM `refinery_breweries` INNER JOIN `refinery_beer_brands` ON `refinery_beer_brands`.`brewery_id` = `refinery_breweries`.`id`
=> 34
查询 5:
2.1.5 :126 > ::Refinery::Breweries::Brewery.joins(:beer_brands).where(:refinery_beer_brands => { beer_type: [0,1,2,3,4,5] } ).count
(1.1ms) SELECT COUNT(*) FROM `refinery_breweries` INNER JOIN `refinery_beer_brands` ON `refinery_beer_brands`.`brewery_id` = `refinery_breweries`.`id` WHERE `refinery_beer_brands`.`beer_type` IN (0, 1, 2, 3, 4, 5)
=> 34
为什么"query 5" returns只有34条记录?所有 "beer_brands" 必须选择 "beer_type",并且它在数据库编号 0-5 中。我要return303条记录。每个啤酒厂都有很多 beer_brands.
啤酒厂模型:
has_many :beer_brands, :class_name => '::Refinery::BeerBrands::BeerBrand'
啤酒品牌型号:
belongs_to :brewery,:class_name => '::Refinery::Breweries::Brewery'
如何获取相似查询的全部304条记录?我想在查询中过滤具有不同数组的记录。
//编辑 16.3.2015:
好的,你是对的...但我还有一个问题。这个案例呢: 1)啤酒厂可以有啤酒品牌,但不一定要有 2) 我想在啤酒厂名称或其相关啤酒品牌名称中进行全文搜索
现在我的查询如下所示:
out.includes(:beer_brands).where("refinery_breweries.title LIKE ? OR refinery_beer_brands.title LIKE ?", "%#{pars[:query]}%", "%#{pars[:query]}%")"
现在它抛出错误:
Unknown column 'refinery_beer_brands' in 'where clause'
您的查询 1 和 2 显示您在啤酒品牌中只有 34 条记录,这意味着只有少数啤酒厂拥有啤酒品牌,而不是全部 303 个,这就是它仅返回 34 条记录的原因。如果您仍然需要所有 303 记录,请使用 left outer join
或 right outer join
。但是您显然会得到其他啤酒厂的空值。