mysql - Mysql中联合三张表

标签 mysql sql

我有三张表employee,promotion和punishment 员工的表结构是这样的

Id       int
Fullname     varchar
...............
promotionDate       date

Promotion的表结构是这样的 标识整数 emp_id 整型 datedate日期

惩罚的表结构是这样的

id                  int
emp_id              int
direcotorateDate    date

假设employee表有200条记录,每个月有一组员工升职(在职一年后),我想获取当月所有升职员工的列表 我可以通过这个查询轻松获取列表

SELECT * 
FROM employee 
WHERE MONTH(promotionDate) = MONTH(CURRENT_DATE())
   AND YEAR(promotionDate) = YEAR(CURRENT_DATE())

我的问题是 我想分别从惩罚和晋升表中统计每个员工当年受到的惩罚和晋升的次数 我做了这个查询,但没有得到正确的结果

SELECT e.fullname , COUNT(punish.emp_id) as siza ,COUNT(pro.emp_id) as supas
  FROM emp_employee as e
  LEFT JOIN emp_punishment as punish on punish.emp_id=e.id
  LEFT JOIN emp_promotion as pro on e.id=pro.emp_id
 WHERE ((MONTH(e.promotionDate) = MONTH(CURRENT_DATE())
   AND YEAR(e.promotionDate) = YEAR(CURRENT_DATE()))
   AND ( YEAR(punish.directorate_date) = YEAR(CURRENT_DATE()) )
   AND ( YEAR(pro.directorate_date) = YEAR(CURRENT_DATE()) )
 GROUP BY e.fullname;

请帮忙。

最佳答案

通过直接连接 3 个表,您会得到重复的行。
按 emp_id 分组并分别聚合每个表 emp_punishmentemp_promotion 并将结果连接到表 emp_employee

select e.fullname, coalesce(pu.siza, 0) siza, coalesce(pr.supas, 0) supas
from emp_employee as e 
left join (
  select emp_id, count(*) siza
  from emp_punishment
  where year(directorate_date) = year(CURRENT_DATE)
  group by emp_id
) pu on pu.emp_id = e.id
left join (
  select emp_id, count(*) supas
  from emp_promotion
  where year(directorate_date) = year(CURRENT_DATE)
  group by emp_id
) pr on pr.emp_id = e.id 

我只用了条件:

where year(directorate_date) = year(CURRENT_DATE())

因为在你的问题中你说:
我想统计每个员工在 当年 从惩罚和晋升中受到的惩罚和晋升

关于mysql - Mysql中联合三张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020123/

相关文章:

php - 在 Woocommerce 中删除重复的导入订单

sql - 将 EBCDIC 文件导入到 SQL Server

mysql - 如何在VB.NET中等待MySQL更新?

mysql - MySQL 是否有像 Postgres 那样的 COPY TO 命令?

php - 使用php从mysql数据中过滤多个产品

sql - 事务脚本也是 NoSQL 数据库的反模式吗?

mysql - sql查询将天数添加到特定列日期

php - 为什么 PHP 的 MySQL 驱动程序不转换数据类型?

php - 如何使用HTML和PHP搜索项目并将结果与​​表单输出在同一页面上?

sql - 使用 DEFAULT 或 INTEGER 值作为 SQL 函数的参数