使用PHP和MYSQL统计年龄组数据

4
我希望在我的网站上展示用户统计数据,返回各年龄组的百分比,例如:
-13 years : $percent %
13-15 years : $percent %
15-20 years : $percent %
23+ : $percent %

在我的mysql表中,我有一个返回日期时间(yyyy-mm-dd)的birth_date列。
你有什么提示或想法来做到这一点吗?

Hints - HamZa
4个回答

5

纯 SQL:

SELECT
    `group`,
    COUNT(*) as `count`
FROM
`user`
INNER JOIN (
    SELECT 
        0 as `start`, 12 as `end`, '0-12' as `group`
    UNION ALL 
    SELECT
        13, 14, '13-14'
    UNION ALL
    SELECT
        15, 19, '15-19'
    UNION ALL
    SELECT
        20, 150, '20+'
) `sub`
    ON TIMESTAMPDIFF(YEAR, `birth_date`, NOW()) BETWEEN `start` AND `end`
GROUP BY `group` WITH ROLLUP;

除此之外,其他的都可以通过PHP计算。


我有一个包含3606个条目的NULL数组。我认为这是输入不正确或为空日期的用户数量。 但一切都很好,向比什凯克致敬 ;) - kesm0
@kesm0,不是的,这是通过“JOIN”条件匹配的用户总数。此查询将忽略不正确的“birth_date”。 - BlitZ
好的,为什么我的groupe = NULL而count = 3606?我有4073个用户。 - kesm0
@kesm0,移除 WITH ROLLUP。它计算查询的最后一行。那么应该就没问题了。 - BlitZ
没问题!谢谢你的帮助和时间!我不是 SQL 语言的专家 :/ - kesm0
显示剩余4条评论

4
select case when year(curdate() - birth_date) < 13 
            then '< 13 years'
            when year(curdate() - birth_date) between 13 and 14 
            then '13 - 14 years'
            when year(curdate() - birth_date) between 15 and 20 
            then '15 - 20 years'
            when year(curdate() - birth_date) >= 23 
            then '+23 years'
         end as `description`,
       (select count(*) from your_table) / count(*) 
from your_table
group by case when year(curdate() - birth_date) < 13 then 1
              when year(curdate() - birth_date) between 13 and 14 then 2
              when year(curdate() - birth_date) between 15 and 20 then 3
              when year(curdate() - birth_date) >= 23 then 4
         end

嗨!我不知道如何在PHP中使用它。它返回奇怪的数组 :/ - kesm0
我想要使用foreach,并显示年龄组。 - kesm0
如果你在 PHP 中遇到查询问题,你可以提出一个新的问题,并详细解释你卡在哪里。 - juergen d
返回2个数组:描述(NULL,+13年)和select count() from personne) / count() (1.4177,3.3942)。 - kesm0
好的,我明白问题了,谢谢你的帮助 Juergen! :) - kesm0

3

如果你想要纯粹的SQL:

SELECT COUNT(*)    
FROM [table_name]
WHERE birth_date < DATE_ADD(NOW(),INTERVAL 13 YEAR)


WHERE birth_date >= DATE_ADD(NOW(),INTERVAL 13 YEAR)
AND birth_date < DATE_ADD(NOW(),INTERVAL 15 YEAR)

--etc

否则我建议使用PHP来创建日期。
您可以将所有查询联合在一起并创建SQL视图,例如:
CREATE VIEW statistics AS
SELECT "0-13" as age ,COUNT(*) as total
FROM table_name
WHERE birth_date < DATE_ADD(NOW(),INTERVAL 13 YEAR)
UNION
SELECT "13-15" as age ,COUNT(*) as total
FROM table_name
WHERE birth_date >= DATE_ADD(NOW(),INTERVAL 13 YEAR)
    AND birth_date < DATE_ADD(NOW(),INTERVAL 15 YEAR)
UNION
SELECT "15-20" as age ,COUNT(*) as total
FROM table_name
WHERE birth_date >= DATE_ADD(NOW(),INTERVAL 15 YEAR)
    AND birth_date < DATE_ADD(NOW(),INTERVAL 20 YEAR)
UNION
SELECT "20-23" as age ,COUNT(*) as total
FROM table_name
WHERE birth_date >= DATE_ADD(NOW(),INTERVAL 20 YEAR)
    AND birth_date < DATE_ADD(NOW(),INTERVAL 23 YEAR)
UNION
SELECT "23+" as age ,COUNT(*) as total
FROM table_name
WHERE birth_date >= DATE_ADD(NOW(),INTERVAL 23 YEAR)

然后您只需查询:
SELECT * from statistics

我喜欢这个选项,可能是最直观的。 - Glitch Desire

0

将日期时间作为时间戳返回,与now.offset(years=??)进行比较,分类到数组中,然后计算记录数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接