[英]getting wrong results on joins in different tables
它有點復雜,所以我會慢慢解釋,不會恰到好處地插入問題。
我有員工注冊的數據庫架構,這些員工按項目分配工作。
1名員工可以從事許多工作,例如員工John
在任務123
project
abc
上再次員工John
也在project
abc
但是在任務789
456
任務分配給其他人。 但那是另一個問題。
所以我們讓約翰在同一個項目中處理不同的任務,因為我在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
===========================我想要個人記錄,因為我想在表格中顯示它,如下圖所示。
試試這種方式;
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`
你是否只需要這樣的東西:
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
您的timesheet
表或任何您想要命名的表只需要一個外鍵 - job_id
引用assign_job_id和花費在該分配上的小時數。 並且沒有employee_id
或project_id
鍵,因為assign_job
已經擁有該信息。 我不想為你編寫代碼,因為我可以看到你可以自己做。
您將時間表加入assign_job並將其加入員工和項目 - 瞧。 然后,您可以按員工或/和項目或/和任務進行分組。 它就在那里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.