2017-04-25 82 views
1

我有一个MySQL表,persons,有3列,id,name & date_of_birth。 我的表格有大约100行数据,但这可能会增加。根据出生日期将MySQL结果分组到年龄组中

我想用PHP基于年龄组输出者,所以:

20-25: 10 
26-35: 15 
36-45: 12 
46-55: 20 
55+: 30 

现在,我只是用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>'; 
} 

有人能指导我在正确的方向来处理按年龄组分组我的结果吗?

我确实在另一个SO线程中找到了这个,但不确定它在上述上下文中是否有用:SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age

回答

4

我会在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 

内部查询按年龄组的年龄组分配给每个记录,然后外部查询聚集。请注意,嵌套子查询不是必需的,也不会对性能有很大的好处,但用于避免在使用GROUP BY时不得不重复难看的CASE表达式。

然后用下面的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; 
} 
+0

哇,蒂姆 - 不可思议!非常感谢你:-)我现在要做出必要的调整。非常感谢你今天的时间。 – michaelmcgurk

2

试试这个:

$count_20_25 = 0; 
$count_26_35 = 0; 
$count_36_45 = 0; 
$count_46_55 = 0; 
$count_above_55 = 0; 
$curr_year = date('Y'); 

$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]; 
    $temp = abs($curr_year - $year); 
    if($temp >= 20 && $temp <= 25) 
    { 
     $count_20_25++; 
    } 
    elseif($temp >= 25 && $temp <= 35) 
    { 
     $count_26_35++; 
    } 
    elseif($temp >= 36 && $temp <= 45) 
    { 
     $count_36_45++; 
    } 
    elseif($temp >= 46 && $temp <= 55) 
    { 
     $count_46_55++; 
    } 
    else 
    { 
     $count_above_55++; 
    } 
} 

echo '20-25: '.$count_20_25.'<br>'; 
echo '26-35: '.$count_26_35.'<br>'; 
echo '36-45: '.$count_36_45.'<br>'; 
echo '46-55: '.$count_46_55.'<br>'; 
echo '55+: '.$count_above_55.'<br>'; 
3
SELECT CONCAT((FLOOR(`year`/5))*5,'-',((FLOOR(`year`/5))*5)+4) `range`, 
    COUNT(*) qty 
    FROM persons 
    GROUP BY `range`