2012-07-10 26 views
-5

休假管理我有4個表像圖所示加入在MySQL在PHP和MySQL

表:leave_request

+------------+----------+--------------+------------+----------------------+ 
| request_id | staff_id | applied_from | applied_to | status    | 
+------------+----------+--------------+------------+----------------------+ 
|  1  | 10  | 01-07-2012 | 02-07-2012 | approved    | 
|  2  | 12  | 02-07-2012 | 02-07-2012 | awaiting HR approval | 
+------------+----------+--------------+------------+----------------------+ 

表:leave_approval

+-------------+-------------+---------------+-------------+ 
| request_id | approved_by | approved_from | approved_to | 
+-------------+-------------+---------------+-------------+ 
| 1  |  1  | 01-07-2012 | 02-07-2012 | 
| 1  |  2  | 01-07-2012 | 02-07-2012 | 
| 2  |  1  | 02-07-2012 | 02-07-2012 | 
+-------------+-------------+---------------+-------------+ 

表:員工

+-----------+-------+----------+ 
| staff_id | name | group_id | 
+-----------+-------+----------+ 
| 1  | jack |  1 | 
| 2  | jill |  2 | 
| 10  | sam |  3 | 
| 12  | david |  3 | 
+-----------+-------+----------+ 

表格:gr牛津大學出版社

+-----------+------------+ 
| group_id | group_name | 
+-----------+------------+ 
| 1  | admin | 
| 2  |  HR  | 
| 3  | staff | 
+-----------+------------+ 

我需要通過連接這些表作報告,它應該如下:

+----------+------------+----------+-------------+-----------+--------------+-----------+ 
|applied_by|applied_from|applied_to|approved_from|approved_to|approved_admin|approved_hr| 
+----------+------------+----------+-------------+-----------+--------------+-----------+ 
| sam | 01-07-2012 |02-07-2012|01-07-2012 |02-07-2012 | Jack   | Jill  | 
| david | 02-07-2012 |02-07-2012|02-07-2012 |02-07-2012 | Jack   | null  | 
+----------+------------+----------+-------------+-----------+--------------+-----------+ 

感謝提前:)

+1

在此先感謝? [您嘗試過什麼?](http://WhatHaveYouTried.com) – 2012-07-10 10:26:22

+0

您選擇的實體位於'leave_request'表中。所選數據的其餘部分從其他表中加入。你有什麼困難?如果你想知道'JOIN'是如何工作的,我建議你選擇一本關於MySQL的初學者書籍。 – David 2012-07-10 10:36:10

+0

我看到這個問題已經得到-3。好吧,我沒有在這裏發佈任何內容,我也不是MySQL的專家。我在我的查詢中得到了一切,我認爲沒有人觀察到leave_approval表,它有兩行與具有不同staff_id的相同request_id。我想通過檢查groups表在字段(approved_admin和approved_hr)中顯示該名稱。我不知道該怎麼做。這是我的問題。 '希望我很清楚' – 2012-07-10 10:53:16

回答

1

讓我們把它一步一步。 ..

首先,您選擇的實體位於leave_request表中。因此,讓我們從這裏開始:

SELECT leave_request.* FROM leave_request 

現在,你需要知道在理想的效果applied_by列中的數據。所以你加入staff表:(注意,我使用別名表名這將在以後派上用場)

SELECT 
    applied_staff.name AS applied_by 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 

現在你需要知道applied_fromapplied_to,你已經擁有:

SELECT 
    applied_staff.name AS applied_by, 
    leave_request.applied_from, 
    leave_request.applied_to 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 

現在你需要知道approved_fromapproved_to,這是在leave_approval表:

SELECT 
    applied_staff.name AS applied_by, 
    leave_request.applied_from, 
    leave_request.applied_to, 
    admin_approval.approved_from, 
    admin_approval.approved_to 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 
    INNER JOIN leave_approval AS admin_approval ON leave_request.request_id = admin_approval.request_id 

呃哦,現在我們有一個問題。有一對多的關係,所以現在我們在結果中有重複的請假。我們需要以某種方式過濾掉它。你不指定如何,所以我打算做一些假設:你想知道approved_fromapproved_to的「管理員」批准,並且只會有一個「管理員」批准。

我們反映這些假設中的表連接:

SELECT 
    applied_staff.name AS applied_by, 
    leave_request.applied_from, 
    leave_request.applied_to, 
    admin_approval.approved_from, 
    admin_approval.approved_to 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 
    INNER JOIN leave_approval AS admin_approval ON leave_request.request_id = admin_approval.request_id 
    INNER JOIN staff AS approved_staff ON admin_approval.approved_by = approved_staff.staff_id 
    INNER JOIN group AS approved_staff_group on approved_staff.group_id = approved_staff_group.group_id 
WHERE 
    approved_staff_group.group_name = 'admin' 

這應該會更好。請注意,表格別名在這裏派上用場,因爲在同一查詢中,我們現在有兩個staff表格用於兩個不同目的。所以我們需要區分它們。 (請記住,我在這裏瞎了眼睛,實際上不能測試任何這些東西,所以如果在這個過程中遇到任何問題,請糾正我的錯誤。我也是免費的,因爲我沒有MySQL方便,所以讓我知道是否有語法錯誤。)

現在,我們將approved_admin字段添加到結果,這已經是可用:

SELECT 
    applied_staff.name AS applied_by, 
    leave_request.applied_from, 
    leave_request.applied_to, 
    admin_approval.approved_from, 
    admin_approval.approved_to, 
    approved_staff.name AS approved_admin 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 
    INNER JOIN leave_approval AS admin_approval ON leave_request.request_id = admin_approval.request_id 
    INNER JOIN staff AS approved_staff ON admin_approval.approved_by = approved_staff.staff_id 
    INNER JOIN group AS approved_staff_group on approved_staff.group_id = approved_staff_group.group_id 
WHERE 
    approved_staff_group.group_name = 'admin' 

最後,我們需要知道approved_hr。並允許null?然後,我們將爲這一個使用不同的連接。我也對上述那些做類似的假設。讓我們試試這個:

SELECT 
    applied_staff.name AS applied_by, 
    leave_request.applied_from, 
    leave_request.applied_to, 
    admin_approval.approved_from, 
    admin_approval.approved_to, 
    approved_staff.name AS approved_admin, 
    hr_staff.name AS approved_hr 
FROM 
    leave_request 
    INNER JOIN staff AS applied_staff ON leave_request.staff_id = applied_staff.staff_id 
    INNER JOIN leave_approval AS admin_approval ON leave_request.request_id = admin_approval.request_id 
    INNER JOIN staff AS approved_staff ON admin_approval.approved_by = approved_staff.staff_id 
    INNER JOIN group AS approved_staff_group on approved_staff.group_id = approved_staff_group.group_id 
    LEFT OUTER JOIN leave_approval AS hr_approval ON leave_request.request_id = hr_approval.request_id 
    LEFT OUTER JOIN staff AS hr_staff ON hr_approval.approved_by = hr_staff.staff_id 
    LEFT OUTER JOIN group AS hr_staff_group ON hr_staff.group_id = hr_staff_group.group_id 
WHERE 
    approved_staff_group.group_name = 'admin' 
    AND hr_staff_group.group_name = 'HR' 

我不完全肯定那些後者LEFT OUTER JOIN秒。第一個肯定會需要一個允許null值的連接,但我不確定查詢引擎如何處理連接。我寧願他們在最初的LEFT OUTER JOIN範圍內的INNER JOIN s。但我想所有這些都取決於數據的完整性,我不能保證。

值得注意的是,當聲明值爲"jack"時,您聲稱想將"Jack"作爲輸出。我沒有在這段代碼中做任何字符串操作來實現這一點。如果該值應該在數據中大寫,則將其大寫在數據中。

再次,我不能保證此代碼。但作爲一個步行,它應該讓你朝着正確的方向前進。正如我在對這個問題的評論中提到的,如果你打算編寫MySQL代碼,我真的建議你拿一本關於MySQL的書。

編輯:我可以給出的一個建議是數據本身的結構。具體來說,leave_approval桌子感覺有點凌亂,而這正是造成混淆的桌子。我有幾條建議:

  1. approval_type加到leave_approval表中。至少這將表明它是否是管理員批准,人力資源批准或任何其他類型的批准。 (是否還有其他類型?是否會有?)然後,您還可以使用request_idapproval_type作爲組合主鍵或至少一個組合的唯一約束,以強化更好的數據完整性並防止重複的批准。
  2. 如果只有兩種批准,並且可能不會更改,請在leave_approval表中反映它們。爲admin_approval_*設置一組列,爲hr_approval_*設置一組列。 (每組將包括staff_id以及批准的相關日期。)然後request_id本身可能是leave_approval上的主鍵,使其與leave_request一一對應。這將大大簡化關係數據,實質​​上將leave_approval記錄轉換爲leave_request記錄的可選附加信息集。連接會變得簡單得多,數據會更清晰地表達出來。