MySQL - 计算符合某些标准的组

时间:2016-07-12 15:14:53

标签: mysql

我有以下表格:

家庭

  • ID INT AUTO_INCREMENT
  • CountryOfResidence STRING

  • ID INT AUTO_INCREMENT
  • FamilyID INT FOREIGN KEY
  • DOB DATE

我试图通过CountryOfResidence找到包含1970年以前出生的人的所有家庭的数量。

我无法与PersonFamily进行联接,因为这会给我每个人的唯一数量。我想要在家庭中的任何人在1970年之前出生时,只计算一次家庭。

有人可以帮我制作这个查询吗?我觉得子查询可以完成我想要的,但我担心性能。

修改

添加了SQL小提琴:http://sqlfiddle.com/#!9/b92e3/1/0

预期结果:

------------------------------- 
|CountryOfResidence | count(*)|
|-----------------------------| 
|Poland             | 1       | 
|USA                | 1       |
-------------------------------

3 个答案:

答案 0 :(得分:1)

您可以使用EXISTS

SELECT CountryOfResidence , COUNT(*)
FROM Family AS f
WHERE EXISTS (SELECT 1
              FROM Person AS p
              WHERE f.ID = p.FamilyID AND  Year(DOB) < 1970) 
GROUP BY CountryOfResidence 

答案 1 :(得分:1)

使用COUNT(DISTINCT Family.ID),这样您就不会计算因连接而产生的所有重复项。

SELECT
  f.CountryOfResidence AS country,
  COUNT(DISTINCT f.ID) AS family_count_per_country
FROM Family AS f
INNER JOIN Person as p
  ON f.ID = p.FamilyID
WHERE p.DOB < '1970-01-01'
GROUP BY country

答案 2 :(得分:0)

没理由你不能在这里使用JOIN。虽然让一个居住国家与一个家庭而不是一个人联系在一起,但这对我来说似乎很奇怪。

SELECT
  f.CountryOfResidence AS country,
  COUNT(f.ID) AS family_count_per_country
FROM Family AS f
INNER JOIN Person as p
  ON f.ID = p.FamilyID
WHERE p.DOB < '1970-01-01'
GROUP BY country