【问题标题】:joint three tables in Mysql在Mysql中联合三个表
【发布时间】:2019-07-13 23:34:40
【问题描述】:

我有三张表员工,晋升和惩罚 员工的表结构是这样的

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

Promotion的表结构是这样的 id int emp_id 整数 董事会日期日期

而惩罚的表结构是这样的

id                  int
emp_id              int
direcotorateDate    date

假设员工表有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;

请帮忙。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    通过直接连接 3 个表,您会得到重复的行。
    Group by 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())
    

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

    【讨论】:

      【解决方案2】:

      删除MONTH() 函数,并将每个条件移动到它们各自的位置,而不是在WHERE 子句中应该可以解决问题(因为,它们被视为INNER JOINs 与当前样式)。

      只在WHERE 子句中保留公共列e.promotionDate

      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
         AND  YEAR(punish.directorate_date) = YEAR(CURRENT_DATE())
        LEFT JOIN emp_promotion as pro 
          ON e.id=pro.emp_id
         AND YEAR(pro.directorate_date) = YEAR(CURRENT_DATE()))
       WHERE YEAR(e.promotionDate) = YEAR(CURRENT_DATE())
       GROUP BY e.fullname;
      

      【讨论】:

        猜你喜欢
        • 2015-01-29
        • 2017-09-26
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 2020-01-05
        相关资源
        最近更新 更多