Php 特定日期之间的Mysql计数和分组

Php 特定日期之间的Mysql计数和分组,php,mysql,group-by,between,Php,Mysql,Group By,Between,我有一个疑问 我有一张这样的桌子: tbl_人 id | startDate | endDate | Gender 1 | 2010-03-01 | 2011-04-11 | m 2 | 2010-04-01 | 2010-06-14 | f 3 | 2010-03-01 | 2010-04-11 | m 4 | 2009-09-09 | 2009-10-10 | f 在数据库中给出的所有年份中,我想计算在开始日期和结束日期之间的人的性别。当startDate为2010年和en

我有一个疑问

我有一张这样的桌子: tbl_人

id | startDate  | endDate    | Gender
1  | 2010-03-01 | 2011-04-11 | m
2  | 2010-04-01 | 2010-06-14 | f
3  | 2010-03-01 | 2010-04-11 | m
4  | 2009-09-09 | 2009-10-10 | f
在数据库中给出的所有年份中,我想计算在开始日期和结束日期之间的人的性别。当startDate为2010年和endDate为2011年时,两者都应计算在内

所以结果应该是这样的:

year | m | f | m+f
2009 | 0 | 1 | 1
2010 | 2 | 1 | 3
2011 | 1 | 0 | 1
我真的不知道如何实现对所有年份的列表的查询。 目前我有:

select
    sum(case tbl_people.Gender when 'm' then 1 else 0 end),
    sum(case tbl_people.Gender when 'f' then 1 else 0 end),
    count( tbl_people.Gender )
...

向您致意

您需要加入一个包含所有年份的表。您可以创建包含所有年份的实际表,也可以在子查询中动态构造它:

SELECT y.year, 
        SUM(p.Gender = 'm') AS m,
        SUM(p.Gender = 'f') AS f,
        COUNT(*) AS `m+f`
FROM (SELECT 2009 AS year
      UNION
      SELECT 2010 AS year
      UNION
      SELECT 2011 AS year) AS y
LEFT JOIN tbl_people AS p ON y.year BETWEEN YEAR(p.startDate) AND YEAR(p.endDate)
GROUP BY y.year