简体   繁体   English

mysql将1张表加入另外2张表

[英]mysql join 1 table to 2 other tables

I need to compare actual hours to estimated hours for each task in a project. 我需要将项目中每个任务的实际工时与估计工时进行比较。 The information lives in 3 different tables 信息存放在3个不同的表中

Tasks Table: Contains all the project task information 任务表:包含所有项目任务信息

  • Task ID (key) 任务ID(键)
  • Task Name 任务名称
  • Project Name 项目名

Timesheets Table: Contains the actual hours logged to the task 时间表表:包含记录到任务的实际小时数

  • Task ID 任务ID
  • Task Name 任务名称
  • Hours (sum) [multiple Timesheets records for each task] 小时(总和)[每个任务的多个时间表记录]

Task Owner Table: Contains the estimated hours assigned to the task 任务负责人表:包含分配给任务的估计工时

  • Task Id 任务编号
  • Task Name 任务名称
  • Estimated Hour (sum) [multiple Task Owner records for each task] 估计的小时数(总和)[每个任务的多个任务所有者记录]

I need to pull the task information from the Tasks table, the sum of actual hours from the timesheets table, and sum of estimated hours from the Task Owner table 我需要从“任务”表中获取任务信息,从时间表表中获取实际工时总数,并从“任务所有者”表中获取预计工时总数

Here is what it should look like: 它应该是这样的:

Project Name | Task Name | Actual Hours | Estimated Hours

Here is my starting query which shows me the total actual hours per project task. 这是我的开始查询,向我显示每个项目任务的总实际小时数。 Now I need to know how to add a column for total estimated hours 现在,我需要知道如何为总估算时间添加一列

SELECT
tasks."Project Name" AS "Project Name",
tasks."Task Name" AS "Task Name",
sum("Timesheets"."Hours") AS "Hours"
FROM "Tasks" join "Timesheets" ON "Tasks"."Task ID" = "Timesheets"."Task ID"
GROUP BY tasks."Project Name", tasks."Task Name"

it would be possible to assign the aggregate columns to select subqueries: 可以分配聚合列来select子查询:

SELECT
tasks."Project Name" AS "Project Name",
tasks."Task Name" AS "Task Name",
(select sum("Timesheets"."Hours" FROM "Timesheets" where "Timesheets"."Task ID" = "Tasks"."Task ID") as "Hours",
(select sum("Task Owner"."Hours" FROM "Timesheets" where "Task Owner"."Task ID" = "Tasks"."Task ID") as "Estimated Hours"
FROM "Tasks"

You should add another join: 您应该添加另一个联接:

SELECT
    tasks.`Project Name` AS `Project Name`,
    tasks.`Task Name` AS `Task Name`,
    sum(`Timesheets`.`Hours`) AS `Hours`
    sum(`Task Owner`.Estimated Hour`) AS `Estimated Hour`
    FROM `Tasks` 
    join `Timesheets` ON `Tasks`.`Task ID` = `Timesheets`.`Task ID`
    join `Task Owner`  ON `Tasks`.`Task ID` = `Task Owner`.`Task ID`

GROUP BY tasks.`Project Name`, tasks.`Task Name`

And I would like to suggest you use of backtics instead of double quote for table and column names. 我想建议您使用反斜线来代替表名和列名。

It may help here to pre-aggregate your actual and estimated hours in a subquery and THEN join it in. This is especially important if you have many rows for both your Task Owner and Timesheets table for each distinct task id . 这可能有助于在此处预先汇总子查询中的实际时间和估计时间,然后将其加入。如果每个task id Task Owner表和“ Timesheets表都有很多行,则这尤其重要。

SELECT
    tasks.`Project Name` AS `Project Name`,
    tasks.`Task Name` AS `Task Name`,
    actual.hours,
    estimated.hours,
FROM Tasks 
    INNER JOIN (SELECT `TASK ID`, SUM(Hours) as hours FROM Timesheets GROUP BY `TASK ID`) actual
        ON Tasks.`Task ID` = actual.`Task ID`
    INNER JOIN (SELECT `TASK ID`, SUM(`Estimated Hour`) as hours FROM `Task Owner` GROUP BY `TASK ID`) estimated 
        ON Tasks.`TASK ID` = estimated.`TASK ID`

Going with this method insures that each subquery returns a unique record for each task id with the sum of estimated or actual hours. 使用此方法可确保每个子查询返回每个task id的唯一记录,并包含估计或实际小时数的总和。

You can't just join the three tables directly together since both "Timesheets" and "Task Owner" can have duplicate values in column "task id". 您不能仅将三个表直接连接在一起,因为“时间表”和“任务所有者”在“任务ID”列中都可以有重复的值。 To avoid generating more rows when joining, you need to group those tables beforehand. 为了避免在连接时产生更多的行,您需要预先对这些表进行分组。 That could be done with subqueries, but using WITH results in clean code. 可以使用子查询来完成,但是使用WITH可以得到干净的代码。

WITH actual AS (
    SELECT
        "Task ID",
        SUM(Hours) AS hours
    FROM "Task Owner"
    GROUP BY "Task ID"
),

estimated AS (
    SELECT
        "Task ID",
        SUM(Hours) AS hours
    FROM Timesheets
    GROUP BY "Task ID"
)

SELECT 
    t."project name"      AS "Project Name", 
    t."task name"         AS "Task Name", 
    a.hours               AS "Actual Hours"
    e.hours               AS "Estimated Hours"
FROM tasks t
LEFT JOIN actual a
    ON t."task id" = a."task id" 
LEFT JOIN estimated e
    ON t."task id" = e."task id" 
GROUP  BY tasks."project name", 
    tasks."task name" 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM