我有一个MySQL表,persons有3列id,name&date_of_birth。我的表有大约100行数据,但是这可能会增加。
我想使用PHP根据年龄段输出人员,因此:
20-25: 10
26-35: 15
36-45: 12
46-55: 20
55+: 30
Run Code Online (Sandbox Code Playgroud)
现在,我只是使用PHP通过以下代码来获取所有出生日期:
$sql2 = "SELECT date_of_birth FROM persons";
$result2 = $conn->query($sql2);
while($row2 = $result2->fetch_assoc()) {
    $date_of_birth = explode('-', $row2['date_of_birth']);
    $year = $date_of_birth[0];
    $month = $date_of_birth[1];
    $day = $date_of_birth[2];
    echo 'Year of Birth: '.$year.'<br>';
}
Run Code Online (Sandbox Code Playgroud)
有人可以指导我朝正确的方向处理按年龄段分组的结果吗?
我确实在另一个SO线程中找到了这个,但是不确定在上述情况下是否有用SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age。
我可以通过在MySQL查询本身中分配年龄组来解决此问题,然后让PHP显示结果集。您可以尝试以下查询:
SELECT t.age_group, COUNT(*) AS age_count
FROM
(
    SELECT
        CASE WHEN TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN 20 AND 25
             THEN '20-25'
             WHEN TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN 26 AND 35
             THEN '26-35'
             WHEN TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN 36 AND 45
             THEN '36-45'
             WHEN TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) BETWEEN 46 AND 55
             THEN '46-55'
             WHEN TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) > 55
             THEN '46-55'
             ELSE 'Other'
        END AS age_group
    FROM persons
) t
GROUP BY t.age_group
Run Code Online (Sandbox Code Playgroud)
内部查询为每个记录分配一个年龄组,然后外部查询按年龄组进行汇总。请注意,嵌套子查询不是必需的,它也不会对性能产生很大的好处,但是它用于避免CASE在使用时必须重复难看的表达式GROUP BY。
然后使用以下PHP代码:
$sql2 = "...";  // use the above query
$result2 = $conn->query($sql2);
while ($row2 = $result2->fetch_assoc()) {
    $age_group = $row2['age_group']);
    $age_count = $row2['age_count']);
    echo $age_group.': '.$age_count;
}
Run Code Online (Sandbox Code Playgroud)