在不同表中的连接上得到错误的结果

时间:2014-12-13 09:56:54

标签: php mysql database

它有点复杂,所以我会慢慢解释一下,不会正确地解决这个问题。

我有员工注册的数据库架构, 这些员工按项目分配工作。

1名员工可以从事许多工作,例如e-g 任务John上的员工project位于abc 123 员工John也在project abc上,但在任务789

456任务分配给其他人。但那是另一个问题。

所以我们让John为不同的任务处理相同的项目,因为我在assign_job表中有两个条目。

让我们在下面的小架构中查看图像。 enter image description here

这个架构很好。我现在面临的问题是我想要时间表。 所以我添加了两张Time Shedule表。

下面的新架构 enter image description here

我在下面列出的两个项目的两个新表中添加了一些虚拟条目。

  1. 招聘&选择
  2. 培训&发展
  3. 对于项目1我添加了31个条目意味着每天都有一些工作时间。 但对于项目2,该员工只工作了一天。

    现在我运行了这个查询我认为这不是在这种情况下创建联接的正确方法。因为我在数据库中获得了错误的结果,所以我发布了这个问题。

    SELECT 
    TS.`date_created` AS TimeSheetMonth, 
    TSD.`project_id` AS ProjectID, 
    TSD.`date` AS WorkDate, 
    TSD.`hours` AS WorkHours, 
    TS.`employee_id` AS EmployeeID,
    E.`full_name` AS EmployeeName,
    MLP.`project_title` AS ProjectTitle,
    TS.`id` AS TimeSheetID
    FROM timesheet TS
    INNER JOIN timesheet_details TSD
    ON TS.`id`= TSD.`timesheet_id`
    INNER JOIN employee E
    ON E.`employee_id` = TS.`employee_id`
    INNER JOIN assign_job AJ
    ON AJ.`employee_id` = E.`employee_id` AND AJ.`trashed` = 0
    INNER JOIN ml_projects MLP
    ON AJ.`project_id` = MLP.`project_id`
    INNER JOIN ml_projects TMLP
    ON TMLP.`project_id` = TSD.`project_id`
    WHERE TS.`id`=1
    GROUP BY TSD.`timesheetDetails_id`, TSD.`project_id`
    

    正如您在下面的屏幕截图中看到的那样,我正在获取项目ID 1的项目名称,因为我得到2作为项目ID ..可能还有更多问题。请告诉我在这些连接中我做错了什么?

    enter image description here

    ============================

    更新

    SQLFIDDLELINK: 点击标题或从下方复制。

    http://sqlfiddle.com/#!2/dc4585/1
    

    =========================== 我想要个人记录,因为我想在表格中显示它,如下图所示。

    enter image description here

3 个答案:

答案 0 :(得分:1)

以这种方式试试;

SELECT 
    TSD.`project_id` AS ProjectID, 
    TSD.`date` AS WorkDate, 
    TSD.`hours` AS WorkHours, 
    TS.`date_created` AS TimeSheetMonth,
    TS.`employee_id` AS EmployeeID,
    TS.`id` AS TimeSheetID,
    E.`full_name` AS EmployeeName,
    MLP.`project_title` AS ProjectTitle
FROM
    timesheet TS
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id`
    INNER JOIN employee E ON E.`employee_id` = TS.`employee_id`
    INNER JOIN assign_job AJ ON AJ.`employee_id` = E.`employee_id` 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id`
    -- INNER JOIN ml_projects TMLP ON TMLP.`project_id` = TSD.`project_id` -- what for?
WHERE 
    TS.`id`=1
    AND AJ.`trashed` = 0
GROUP BY 
    TSD.`timesheetDetails_id`, TSD.`project_id`

答案 1 :(得分:1)

你是否需要这样的东西:

SELECT 
    concat(TS.`employee_id`, " - ", E.`full_name`) as employee,
    concat(TSD.`project_id`, " - ", MLP.`project_title`) as Project,
    TS.`date_created` AS TimeSheetMonth,
    sum(1) as WorkDaysOnProjectInMonth,
    sum(TSD.`hours`) AS WorkHoursOnProjectInMonth

FROM
    timesheet TS
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id`
    INNER JOIN employee E ON E.`employee_id` = TS.`employee_id`
    INNER JOIN assign_job AJ ON AJ.`employee_id` = E.`employee_id` 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id`
WHERE 
    TS.`id`=1
    AND AJ.`trashed` = 0
GROUP BY
        1,2

修改

哇,好难的问题!但我认为这解决了你的问题:

SELECT 
    aj.PROJECT_ID,AJ.`employee_id`,
    mlp.project_title,
    e.full_name,
    TS.id,
    TSD.date, TSD.hours

FROM
   assign_job AJ 
    INNER JOIN ml_projects MLP ON AJ.`project_id` = MLP.`project_id` -- P:1
    INNER JOIN employee E ON AJ.`employee_id` = E.`employee_id`
    INNER JOIN timesheet TS ON E.`employee_id` = TS.`employee_id`
    INNER JOIN timesheet_details TSD ON TS.`id`= TSD.`timesheet_id`

WHERE 
    TS.`id`=1
    AND AJ.`trashed` = 0

答案 2 :(得分:1)

您的timesheet表或任何您想要命名的表只需要一个外键 - job_id引用assign_job_id和花在该分配上的时间。并且没有employee_idproject_id的密钥,因为assign_job已经拥有该信息。我不想为你编写代码,因为我可以看到你可以自己做。

您将时间表加入assign_job并将其加入员工和项目 - 瞧。然后,您可以按员工或/和项目或/和任务进行分组。它就在那里