簡體   English   中英

根據出生日期將MySQL結果分組為年齡組

[英]Group MySQL results into age groups based on date of birth

我有一個MySQL表persons ,具有3列idnamedate_of_birth 我的表有大約100行數據,但是這可能會增加。

我想使用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

我可以通過在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;
}
    SELECT CONCAT((FLOOR(`year`/5))*5,'-',((FLOOR(`year`/5))*5)+4) `range`,
    COUNT(*) qty 
    FROM persons  
    GROUP BY `range`

嘗試這個:

$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>';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM