2017-04-25 81 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`