我对 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
因此,我希望获得包含许多列的单行以及每个条件的计数。
实际上,我正在根据年龄分组过滤当前成员。
我尝试过子查询,但未能使其正常工作。
谢谢
最佳答案
如果您确实想要您提到的最终结果,您可以使用 View 。要达到这个结果还需要很长的路要走。然而,这就是方法。我创建了下表 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
的单独 View ,如下所示。
CREATE VIEW current_members AS (SELECT * FROM member WHERE TIMESTAMPDIFF(YEAR, CAST(CURRENT_TIMESTAMP AS DATE), member.expiry) >= 0);
然后从该 View 进行查询,我创建了 3 个单独的 View ,其中包含年轻
、中
和老年
每个年龄范围的计数,如下所示。
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);
最后,将三个 View 交叉连接,以便将每个年龄范围的计数放入一个最终表的一行中,如下所示。
SELECT * FROM young, middle, old;
这将为您提供以下结果。
Young | Middle | Old
----------------------
2 | 4 | 3
建议:对于上述繁琐的时差计算,您可以编写自己的存储过程来简化代码
关于MYSQL 多个条件语句进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43337314/