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

Posted

技术标签:

【中文标题】带有两个 INNER JOINS 的 SQL 查询抛出 HAVING COUNT【英文标题】:SQL query with two INNER JOINS throws off HAVING COUNT 【发布时间】:2015-11-06 19:17:25 【问题描述】:

我正在 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
;

您可以从这个小提琴中看到,“Provider 1”现在显示计数为 6,而“Provider 2”显示计数为 4。

关于如何构造它以获得我需要的计数有什么想法吗?如果有一种简单的方法可以将其作为 ActiveRecord 中的范围来处理,则非常感谢,但我也会接受 SQL 答案。

【问题讨论】:

【参考方案1】:

解决这个问题的快速简便的方法——可能——是使用count(distinct)

HAVING COUNT(DISTINCT accepted_insurance_providers.insurance_provider_id) >= 3

问题在于加入的其他表有多个匹配项。这乘以行数并抛出然后计数。

【讨论】:

你是我的英雄!我知道必须有一个简单的解决方案。

以上是关于带有两个 INNER JOINS 的 SQL 查询抛出 HAVING COUNT的主要内容,如果未能解决你的问题,请参考以下文章

SQL 2 INNER JOINS 与 3 个表

sql JOINs - JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN

带有 INNER JOIN 和 WHERE 的 SQL 查询

带有两个子查询/连接的 JPA 标准选择

Caml 多表关联查询

带有 INNER JOIN 的两个表的 SQL INSERT 语句