2011-01-10 79 views
6

本質上來說,我有一個包含用戶及其相應出生日期的mysql數據庫。我還發現下面的代碼可以幫助我從出生之日起查找用戶的實際年齡。 Finding date of birth我需要做的是找到不同的「年齡段」,並計算該年齡段的用戶數量。我還發現this示例顯示瞭如何對這些數據進行分組。我想首先計算年齡,並以類似於以下link中所示的方式使用它。我寫了下面的代碼,運行時出現錯誤:如何按mysql中的年齡段劃分用戶數

SELECT DATE_FORMAT(NOW(), '%Y') - 
DATE_FORMAT(data_of_birth, '%Y') - 
(DATE_FORMAT(NOW(), '00-%m-%d') < 
DATE_FORMAT(data_of_birth, 
'00-%m-%d')) AS age, COUNT(*), 
CASE 
    WHEN age >= 10 AND age <= 20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <= 50 THEN '31-40' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
END AS ageband 
.. .. 
GROUP BY ageband 

我收到一個錯誤,指出字段時間未知。我寫錯了嗎?我可以很容易地寫出計算年齡的代碼段,其中年齡寫在案例陳述中,但這看起來效率很低。我不是很擅長mysql(還),我知道必須有更好的方法來做到這一點。我想我的主要問題是,如果有某種方式來在查詢中創建一個函數並將該函數的輸出分配給一個值?

+0

你有一堆不尋常的代碼來獲得年齡。你可以簡單地做YEAR(CURDATE()) - YEAR(date_of_birth)AS年齡 – dqhendricks 2011-01-10 18:36:16

+0

只有在每個人都在1月1日出生的時候,這纔會工作... – ODaniel 2015-06-24 12:12:45

回答

14

在這種情況下,你可以使用子查詢:

SELECT 
    COUNT(*), 
    CASE 
    WHEN age >=10 AND age <=20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <=50 THEN '41-50' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
    END AS ageband 
FROM 
    (
    DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age, 
.. .. 
) as tbl 
GROUP BY ageband; 

所以首先它執行的子查詢,並建立青睞的表,比它聚合的時代價值。