2017-04-11 259 views
0

我很新的MYSQL,已經看過這個網站的許多答案,但不能讓下面的工作...MYSQL多個條件語句

表是「會員」 3個字段「id」(Integer);和2個日期字段「出生日期」和「到期」 我需要統計的記錄,其中都是當前成員數,即 expiry<curdate() 然後我需要知道的記錄,符合下列條件的數: year(curdate())-year(dob) <25 as young year(curdate())-year(dob) >25 and <=50 as Medium year(curdate())-year(dob) >50 as Older

因此,我希望得到一個單行多列和每種情況的計數。

切實我過濾電流成員的年齡分組。

我已經嘗試了子查詢,但未能得到那個工作。

感謝

+0

見https://meta.stackoverflow.com/questions/333952/why-應該我提供了一個mcve爲什麼似乎對我來說是一個非常簡單的sql查詢 – Strawberry

+1

可能重複[如果條件在MySQL查詢計數](http:///stackoverflow.com/questions/9798937/count-with-if-condition-in-mysql-query) – Shadow

+0

您可能不需要羣組,但條件計數在答案中有所描述。 – Shadow

回答

0

如果你真的想最終的結果如你所說,你可以使用的意見。實現結果需要很長的路要走。但是,這是方法。我創建了下面的表member並插入數據如下。

CREATE TABLE member (
    id int(11) AUTO_INCREMENT PRIMARY KEY, 
    dob date DEFAULT NULL, 
    expiry date DEFAULT NULL 
); 

INSERT INTO member (id, dob, expiry) VALUES 
    (1, '1980-01-01', '2020-05-05'), 
    (2, '1982-05-05', '2020-01-01'), 
    (3, '1983-05-05', '2020-01-01'), 
    (4, '1981-05-05', '2020-01-01'), 
    (5, '1994-05-05', '2020-01-01'), 
    (6, '1992-05-05', '2020-01-01'), 
    (7, '1960-05-05', '2020-01-01'), 
    (8, '1958-05-05', '2020-01-01'), 
    (9, '1958-07-07', '2020-05-05'); 

以下是member表中的數據。

id | dob  | expiry 
-------------------------------- 
1 | 1980-01-01 | 2020-05-05 
2 | 1982-05-05 | 2020-01-01 
3 | 1983-05-05 | 2020-01-01 
4 | 1981-05-05 | 2020-01-01 
5 | 1994-05-05 | 2020-01-01 
6 | 1992-05-05 | 2020-01-01 
7 | 1960-05-05 | 2020-01-01 
8 | 1958-05-05 | 2020-01-01 
9 | 1958-07-07 | 2020-05-05 

然後,我爲所有名爲current_members的當前員工創建了一個單獨的視圖,如下所示。

CREATE VIEW current_members AS (SELECT * FROM member WHERE TIMESTAMPDIFF(YEAR, CAST(CURRENT_TIMESTAMP AS DATE), member.expiry) >= 0); 

然後從該視圖查詢,我創建包含的youngmiddleold如下各年齡段的計數3個單獨的視圖。

CREATE VIEW young AS (SELECT COUNT(*) as Young FROM (SELECT TIMESTAMPDIFF(YEAR, current_members.dob, CAST(CURRENT_TIMESTAMP AS DATE)) AS age FROM current_members HAVING age <= 25) yng); 
CREATE VIEW middle AS (SELECT COUNT(*) as Middle FROM (SELECT TIMESTAMPDIFF(YEAR, current_members.dob, CAST(CURRENT_TIMESTAMP AS DATE)) AS age FROM current_members HAVING age BETWEEN 25 AND 50) mid); 
CREATE VIEW old AS (SELECT COUNT(*) as Old FROM (SELECT TIMESTAMPDIFF(YEAR, current_members.dob, CAST(CURRENT_TIMESTAMP AS DATE)) AS age FROM current_members HAVING age >= 50) old); 

最後,這三個觀點是交叉,以獲得各年齡段的計數爲一個決賽桌單行如下加盟。

SELECT * FROM young, middle, old; 

這會給你以下結果。

Young | Middle | Old 
---------------------- 
    2 | 4 | 3 

建議:對於上述繁瑣的時差演算過程,你可以寫自己的存儲過程來簡化代碼