首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于计数的MYSQL多条件语句

问用于计数的MYSQL多条件语句
EN

Stack Overflow用户
提问于 2017-04-11 13:21:03
回答 1查看 111关注 0票数 0

我是MYSQL的新手,已经看过这个网站上的许多答案,但无法获得以下工作…

表是“成员”3个字段是"id“(整数);和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

因此,我希望得到包含许多列的单行,以及每个条件的计数。

我有效地过滤了当前成员的年龄分组。

我尝试了一个子查询,但没有成功。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-04-11 19:41:09

如果你真的想要你已经提到的最终结果,你可以使用视图。这需要很长的一段路才能实现。然而,这是一种方法。我创建了下面的表member并插入数据,如下所示。

代码语言:javascript
复制
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表。

代码语言:javascript
复制
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的员工创建了一个单独的视图,如下所示。

代码语言:javascript
复制
CREATE VIEW current_members AS (SELECT * FROM member WHERE TIMESTAMPDIFF(YEAR, CAST(CURRENT_TIMESTAMP AS DATE), member.expiry) >= 0);

然后从该视图中查询,我创建了3个单独的视图,其中包含young、middle和old的每个年龄范围的计数,如下所示。

代码语言:javascript
复制
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);

最后,将这三个视图交叉连接,以便将每个年龄范围的计数放入最后一个表的一行中,如下所示。

代码语言:javascript
复制
SELECT * FROM young, middle, old;

这将为您提供以下结果。

代码语言:javascript
复制
Young | Middle | Old
----------------------
   2  |    4   |  3

建议:对于上面繁琐的时间差计算,您可以编写自己的存储过程来简化代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43337314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档