它有点复杂,所以我会慢慢解释一下,不会正确地解决这个问题。
我有员工注册的数据库架构, 这些员工按项目分配工作。
1名员工可以从事许多工作,例如e-g
任务John
上的员工project
位于abc
123
员工John
也在project
abc
上,但在任务789
上
456
任务分配给其他人。但那是另一个问题。
所以我们让John为不同的任务处理相同的项目,因为我在assign_job表中有两个条目。
让我们在下面的小架构中查看图像。
这个架构很好。我现在面临的问题是我想要时间表。 所以我添加了两张Time Shedule表。
下面的新架构
我在下面列出的两个项目的两个新表中添加了一些虚拟条目。
对于项目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 ..可能还有更多问题。请告诉我在这些连接中我做错了什么?
============================
更新
SQLFIDDLELINK: 点击标题或从下方复制。
http://sqlfiddle.com/#!2/dc4585/1
=========================== 我想要个人记录,因为我想在表格中显示它,如下图所示。
答案 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_id
或project_id
的密钥,因为assign_job
已经拥有该信息。我不想为你编写代码,因为我可以看到你可以自己做。
您将时间表加入assign_job并将其加入员工和项目 - 瞧。然后,您可以按员工或/和项目或/和任务进行分组。它就在那里