MYSQL 多个条件语句进行计数

Posted

技术标签:

【中文标题】MYSQL 多个条件语句进行计数【英文标题】:MYSQL multiple conditional statements for count 【发布时间】:2017-09-06 07:58:29 【问题描述】:

我是 mysql 的新手,在这个网站上查看了很多答案,但无法让以下工作...

表是“成员” 3个字段是“id”(整数);和 2 个日期字段“dob”和“expiry” 我需要计算所有都是当前成员的记录数,即 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

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

实际上,我正在根据年龄分组过滤当前成员。

我尝试了一个子查询,但未能让它工作。

谢谢

【问题讨论】:

见meta.***.com/questions/333952/… Count with if condition in mysql query的可能重复 您可能不需要分组依据,但答案中描述了条件计数。 【参考方案1】:

如果你真的想要你提到的最终结果,你可以使用视图。要达到这个结果需要很长的路要走。但是,这是方法。我创建了下表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);

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

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

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

【讨论】:

以上是关于MYSQL 多个条件语句进行计数的主要内容,如果未能解决你的问题,请参考以下文章

mysql 多个条件的删除一条记录的语句

mysql语句where条件中的是啥意思

Mysql查询详解(条件查询、子查询、模糊查询、连接查询。。。)

mysql原生语句where数组条件查询

在 IF 语句中具有多个条件的 PDO MySQL SELECT

mysql where语句中 or 和 and连用注意点