带有两个INNER JOINS的SQL查询抛出HAVING COUNT

时间:2015-11-06 19:17:25

标签: sql ruby-on-rails

我在rails应用程序中设置查询,仅查看至少有3个已接受保险提供商的care_providers。

http://sqlfiddle.com/#!9/7ce431/13

SELECT `care_providers`.id, name, COUNT(`accepted_insurance_providers`.insurance_provider_id)
  FROM `care_providers`
  INNER JOIN `accepted_insurance_providers` ON `care_providers`.id = `accepted_insurance_providers`.care_provider_id
  GROUP BY `care_providers`.id
  HAVING COUNT(`accepted_insurance_providers`.insurance_provider_id) >=3
  ORDER BY `care_providers`.id ASC
;

上面的小提示是查询应该如何工作。它仅返回提供商1'因为其他提供商的保险提供商少于3家。

当然,我需要在查询上做出许多其他条件,这些条件需要INNER JOIN和其他表。一旦我添加了一个额外的INNER JOIN,我的COUNT就被抛弃了,我让提供者通过我的HAVING COUNT标准,不应该这样做。

http://sqlfiddle.com/#!9/7ce431/12

SELECT `care_providers`.id, name, COUNT(`accepted_insurance_providers`.insurance_provider_id)
  FROM `care_providers`
  INNER JOIN `accepted_insurance_providers` ON `care_providers`.id = `accepted_insurance_providers`.care_provider_id
  INNER JOIN `care_providers_coverage_zip_codes` ON `care_providers_coverage_zip_codes`.care_provider_id = `care_providers`.id 
  GROUP BY `care_providers`.id
  HAVING COUNT(`accepted_insurance_providers`.insurance_provider_id) >=3
  ORDER BY `care_providers`.id ASC
;

你可以从这个小提琴中看到提供者1'现在显示6和'提供商2'显示的是4。

关于我如何构建这个以获得我需要的计数的任何想法?奖励,如果有一种简单的方法可以将其作为ActiveRecord中的范围来处理,但我也会采用SQL答案。

1 个答案:

答案 0 :(得分:3)

解决此问题的快捷方法 - 可能是 - 使用count(distinct)

HAVING COUNT(DISTINCT accepted_insurance_providers.insurance_provider_id) >= 3

问题是加入的其他表有多个匹配项。这会将行数和数量相乘,然后计数。