【问题标题】:MYSQL one big left outer join or 3 left outer joins same tables?MYSQL 一个大的左外连接还是 3 个左外连接相同的表?
【发布时间】:2018-03-05 02:55:39
【问题描述】:

我不确定如何将两个表连接到我的主查询中。确定帐号的两个表连接到 3 个主表中的每一个,用于不同的情况。

我正在尝试根据三件事来确定帐号。 帐号基于工资代码、部门和员工类型,它们是三个不同的表。

这是他们应该如何加入的。

/* all accountnumbers have a paycode_id*/
accountcodes.paycode_id = employee_pay.id
/* all accountnumbers are assigned to either a certain department or all*/
accountcodes.department_code = department.code
/* the accountnumber can be assigned to one emp_type or both*/
accountcodes.emp_type_id = employee_infos.emp_type_id
/* the accountnumber is in table:lkp_accountcodes, that determines the account number table:accountcodes */
accountcodes.lkp_accountcodes_id = lkp_accountcodes.id

表:帐户代码

 -----------------------------------------------------------------------
| ID | lkp_accountcodes_id | paycode_id | department_code | emp_type_id |
|--------------------------|------------|-----------------|-------------|
| 1  |           21        |      15    |         120     |      1      |
| 2  |           22        |      15    |         310     |      1      |
| 3  |           23        |      30    |         null    |      1      |
| 4  |           24        |      30    |         null    |      2      |
| 5  |           25        |      55    |         120     |      1      |
| 6  |           26        |      55    |         310     |      2      |
| 7  |           27        |      55    |         120     |      2      |
 -----------------------------------------------------------------------

表:lkp_accountcodes

 -----------------------------------
|  id | company_id |  accountnumber |
|-----|------------|----------------|
|  21 |   500      |      5210      |
|  22 |   500      |      6210      |
|  23 |   500      |      2211      |
|  24 |   500      |      2210      |
|  25 |   500      |      5010      |
|  26 |   500      |      6000      |
|  27 |   500      |      5090      |
 -----------------------------------

我不知道我是应该做三个左连接,创建临时表,还是像下面这样一个大的左外连接? 另外,我不确定如何对其进行分组,如果部门代码为空,则帐号应由 paycode_id 和 emp_type_id 确定。 帮助我完成下面的查询。

    SELECT i.employee, d.department, e1.paycode, a1.accountnumber
    FROM employee_pay e1
    INNER JOIN employee_infos i ON e1.emp_info_id = i.id
    INNER JOIN department d ON i.department_id = d.id
    LEFT OUTER JOIN accountcodes ac ON ac.paycode_id = e1.id 
        AND ac.emp_type_id = i.emp_type_id 
        AND ac.department_code = d.code -- if null? 
    LEFT OUTER JOIN lkp_accountcodes lgc on gp.lkp_gl_code_id = lgc.id
    -- group? 

预期结果

emp_number | emp_type | deptartment | pay_code | account_number
123        | temp     | 120         | CPP Ded  | 5210
456        | reg      | 310         | CPP Ded  | 6210
789        | temp     | null        | ExpReim  | 2210
987        | reg      | null        | ExpReim  | 2211
654        | reg      | 145         | StatHol  | 5010
321        | temp     | 145         | StatHol  | 5090
333        | temp     | 532         | StatHol  | 6000

【问题讨论】:

  • 请更新您的问题并添加预期结果
  • @scaisEdge 添加了

标签: mysql group-by left-join ifnull multiple-join-rows


【解决方案1】:

如果你没有聚合功能,那么如果你想避免重复行而不是GROUP BY,你应该使用DISTINCT

  SELECT DISTINCT i.employee, d.department, e1.paycode, a1.accountnumber
  FROM employee_pay e1
  INNER JOIN employee_infos i ON e1.emp_info_id = i.id
  INNER JOIN department d ON i.department_id = d.id
  LEFT  JOIN accountcodes ac ON ac.paycode_id = e1.id 
            AND ac.emp_type_id = i.emp_type_id 
            AND ac.department_code = d.code 
  LEFT  JOIN lkp_accountcodes lgc on gp.lkp_gl_code_id = lgc.id

【讨论】:

    【解决方案2】:

    应该没问题。

    SELECT i.employee, d.department, e1.paycode, a1.accountnumber
        FROM employee_pay e1
        JOIN employee_infos i ON e1.emp_info_id = i.id
        JOIN department d ON i.department_id = d.id
        JOIN accountcodes ac ON ac.paycode_id = e1.id 
            AND ac.emp_type_id = i.emp_type_id 
            AND ac.department_code = d.code -- if null? 
        LEFT OUTER JOIN lkp_accountcodes lgc on gp.lkp_gl_code_id = lgc.id;
    

    【讨论】:

    • 分组呢?如果他们的部门为空?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2017-12-07
    相关资源
    最近更新 更多