簡體   English   中英

在不同表中的連接上得到錯誤的結果

[英]getting wrong results on joins in different tables

它有點復雜,所以我會慢慢解釋,不會恰到好處地插入問題。

我有員工注冊的數據庫架構,這些員工按項目分配工作。

1名員工可以從事許多工作,例如員工John在任務123 project abc上再次員工John也在project abc但是在任務789

456任務分配給其他人。 但那是另一個問題。

所以我們讓約翰在同一個項目中處理不同的任務,因為我在assign_job表中有兩個條目。

讓我們在下面的小架構中查看圖像。 在此輸入圖像描述

這個架構很好。 我現在面臨的問題是我想要時間表。 所以我添加了兩張Time Shedule表。

新架構將在下面 在此輸入圖像描述

我在下面列出的兩個項目的兩個新表中添加了一些虛擬條目。

  1. 招聘與選拔
  2. 培訓與發展

對於項目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_idproject_id鍵,因為assign_job已經擁有該信息。 我不想為你編寫代碼,因為我可以看到你可以自己做。

您將時間表加入assign_job並將其加入員工和項目 - 瞧。 然后,您可以按員工或/和項目或/和任務進行分組。 它就在那里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM