我在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答案。
答案 0 :(得分:3)
解决此问题的快捷方法 - 可能是 - 使用count(distinct)
:
HAVING COUNT(DISTINCT accepted_insurance_providers.insurance_provider_id) >= 3
问题是加入的其他表有多个匹配项。这会将行数和数量相乘,然后计数。