mysql多表关联count查询样例

建表:

注意:这些建表语句,是先删除表,再创建的,如果有表,删除drop语句。

DROP TABLE IF EXISTS `lyb_activity`;
CREATE TABLE `lyb_activity` (
  `id` varchar(32) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  `status` int(11) NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `user_id` varchar(32) DEFAULT NULL,
  `vote_status` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `lyb_activity_judge`;
CREATE TABLE `lyb_activity_judge` (
  `id` varchar(32) NOT NULL,
  `activity_id` varchar(32) DEFAULT NULL,
  `user_id` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `lyb_activity_work`;
CREATE TABLE `lyb_activity_work` (
  `id` varchar(32) NOT NULL,
  `activity_id` varchar(32) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `doc_file_id` varchar(32) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `vote_num` int(11) NOT NULL,
  `score` double NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表名1:lyb_activity

表名2:lyb_activity_judge

表名3:lyb_activity_work

查询:查询表1的所有属性,以及表2关联表1的数量,以及表3关联表1的数量。

语句如下:

select a.*,count(distinct j.id) as '表2关联数量',count(distinct w.id) as '表3关联数量'

from lyb_activity a 

left join lyb_activity_judge j on a.id = j.activity_id 

left join lyb_activity_work w on a.id = w.activity_id 

group by a.id order by a.create_time asc;

查询结果:

如果不加distinct,那么查询出来的统计的数量不正确,count的数量是两个count的正确值的乘积。

因为left join 表时,以 lyb_activity 为基础,lyb_activity_judge 如果有3条记录,lyb_activity_work 有2条记录,那么查询出来的数据条数,是 关联的两个表的数据条数的乘积,即查询出6条数据,然后再count时,两个count的值就都是6了,而不是一个3,一个2。

 

 

<think>好的,我需要帮助用户编写一个MySQL查询,用来统计本月不同人员组的请假情况,并按人员分组。首先,我需要明确用户的需求:他们想要获取本月的请假记录,并按人员组进行分组统计。可能涉及到的人员组信息可能存储在用户中,而请假记录则在请假中。因此,需要关联这两个来获取人员组的信息。 首先,确定结构。假设有两个:请假(leave_records)和用户(users)。请假可能包含员工ID(employee_id)、请假开始时间(start_time)、请假类型(leave_type)等字段。用户可能包含员工ID(employee_id)、姓名(name)、所属组别(group_name)等字段。 接下来,需要关联这两个,使用JOIN操作,将员工ID作为关联条件。然后筛选出本月的请假记录。可以使用MySQL的日期函数,如CURDATE()获取当前日期,然后使用YEAR()和MONTH()函数来匹配当前年份和月份。 统计每个组的请假情况,可能需要计算每个组的请假次数或者请假天数。如果用户需要统计请假次数,可以使用COUNT函数;如果需要统计天数,可能需要计算DATEDIFF(end_time, start_time)并求和。这里假设用户需要统计次数,所以用COUNT(*)。 然后按人员组(group_name)进行分组,使用GROUP BY子句。最后,可能需要按请假次数降序排列,方便查看最的组别,使用ORDER BY COUNT(*) DESC。 需要确保日期字段的类型是日期或时间类型,比如DATE或DATETIME,否则日期函数可能无法正确使用。还要考虑跨月份的请假记录如何处理,比如如果请假开始时间在本月,但结束时间在下个月,是否需要拆分统计?但用户的问题可能只需要统计请假开始时间在本月的记录,因此暂时假设以start_time为准。 此外,需要注意用户权限,是否有访问这两个的权限,但这是用户自己的数据库管理问题,不在查询编写范围内。 最后,测试查询是否正确,如使用数据验证结果是否符合预期。可能还需要处理NULL值,比如某些员工未分组的情况,但用户可能希望这些单独统计或排除,根据具体情况调整查询条件。 总结步骤: 1. 使用JOIN关联请假和用户,通过employee_id。 2. WHERE条件筛选start_time在本月。 3. 按group_name分组。 4. 统计每组的请假次数或天数。 5. 排序结果。 现在编写具体的SQL语句,并解释每个部分的作用,确保用户理解。同时生成相关问题,帮助用户深入理解可能的相关需求。</think>### 解答 需要统计本月不同人员组的请假情况,假设存在两张: - **请假** `leave_records`:包含字段 `employee_id`(员工ID)、`start_time`(请假开始时间)、`leave_type`(请假类型) - **用户** `users`:包含字段 `employee_id`(员工ID)、`group_name`(所属人员组) #### 分步实现: 1. **关联并筛选本月数据** 使用 `JOIN` 关联两张,通过 `WHERE` 筛选本月请假记录,借助 `YEAR()` 和 `MONTH()` 函数匹配当前年月: ```sql SELECT u.group_name AS 人员组, COUNT(*) AS 请假次数 FROM leave_records l JOIN users u ON l.employee_id = u.employee_id WHERE YEAR(l.start_time) = YEAR(CURDATE()) AND MONTH(l.start_time) = MONTH(CURDATE()) GROUP BY u.group_name ORDER BY 请假次数 DESC; ``` 2. **扩展统计请假天数** 若需统计总请假天数(假设有 `end_time` 字段): ```sql SELECT u.group_name AS 人员组, SUM(DATEDIFF(l.end_time, l.start_time) + 1) AS 总请假天数 FROM leave_records l JOIN users u ON l.employee_id = u.employee_id WHERE YEAR(l.start_time) = YEAR(CURDATE()) AND MONTH(l.start_time) = MONTH(CURDATE()) GROUP BY u.group_name; ``` #### 注意事项: - 确保 `start_time` 是日期类型(如 `DATE` 或 `DATETIME`)[^1] - 若存在跨月请假(如从本月末到下月初),需明确统计规则(是否拆分天数) - 若人员组存在空值,可通过 `COALESCE(u.group_name, '未分组')` 处理 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值