2017-04-11 248 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 

建议:对于上述繁琐的时差演算过程,你可以写自己的存储过程来简化代码