讓我們把它一步一步。 ..
首先,您選擇的實體位於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_from
和applied_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_from
和approved_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_from
和approved_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
桌子感覺有點凌亂,而這正是造成混淆的桌子。我有幾條建議:
- 將
approval_type
加到leave_approval
表中。至少這將表明它是否是管理員批准,人力資源批准或任何其他類型的批准。 (是否還有其他類型?是否會有?)然後,您還可以使用request_id
和approval_type
作爲組合主鍵或至少一個組合的唯一約束,以強化更好的數據完整性並防止重複的批准。
- 如果只有兩種批准,並且可能不會更改,請在
leave_approval
表中反映它們。爲admin_approval_*
設置一組列,爲hr_approval_*
設置一組列。 (每組將包括staff_id
以及批准的相關日期。)然後request_id
本身可能是leave_approval
上的主鍵,使其與leave_request
一一對應。這將大大簡化關係數據,實質上將leave_approval
記錄轉換爲leave_request
記錄的可選附加信息集。連接會變得簡單得多,數據會更清晰地表達出來。
在此先感謝? [您嘗試過什麼?](http://WhatHaveYouTried.com) – 2012-07-10 10:26:22
您選擇的實體位於'leave_request'表中。所選數據的其餘部分從其他表中加入。你有什麼困難?如果你想知道'JOIN'是如何工作的,我建議你選擇一本關於MySQL的初學者書籍。 – David 2012-07-10 10:36:10
我看到這個問題已經得到-3。好吧,我沒有在這裏發佈任何內容,我也不是MySQL的專家。我在我的查詢中得到了一切,我認爲沒有人觀察到leave_approval表,它有兩行與具有不同staff_id的相同request_id。我想通過檢查groups表在字段(approved_admin和approved_hr)中顯示該名稱。我不知道該怎麼做。這是我的問題。 '希望我很清楚' – 2012-07-10 10:53:16