1

enter image description here書面方式連接查詢爲以下四個表得到的記錄,如果一定條件滿足

從上到下WorkOrderID有許多JobIDs,每個作業ID具有一定的StatusID。 我想只得到那些WorkOrderID的記錄,其每個JobID的StatusID == 9。

根據表中給出的數據,我想只讀取一個結果行,這是WorkOrderID 6,因爲所有作業(JobID = = 1和2)在WorkOrderID == 6下,具有StatusID == 9。

JobID == 4,5,6,7屬於WorkOrderID == 7,因此不能爲WorkOrderID == 7獲取記錄,因爲其JobID之一的StatusID不是9(JobID == 4的StatusID == 1) ,這個WorkOrderID尚未完成。

讓表格名稱從上到下排列。 工作訂單喬布斯Jobs_Status狀態

+0

JobID是否有可能沒有StatusID,或者它有多個StatusID?有各種方法,但知道這是可能的*(以及你想如何對待它)*是你的問題的根本。 *(例如,JobID = 1是否有另一個狀態ID用於不同的StatusTrackDate?如果是這樣,你是否只想考慮每個JobID最近的StatusTrackDate?或者JobID可以沒有StatusID出現,那麼視爲沒有StatusID爲9)* – MatBailie

+0

我只需要獲取這些記錄,只有當某些WorkOrderID下的所有JobID都具有StatusID == 9時。 –

+0

你沒有回答我的任何關於你的數據的問題。 – MatBailie

回答

3

試試看

SELECT * FROM WorkOrders WHERE WorkOrderID IN (
SELECT WorkOrderID FROM Jobs WHERE jobID IN (
SELECT jobID FROM Jobs_Status WHERE StatusID =9)) 

有一件事我要清除的jobID (1,2,5,6,7)StatusID =9所以WorkOrderIDjobID (1,2,5,6,7)6, 7等你說什麼的基礎上

根據表中給出的數據,我們將僅具有一個結果行其是用於WorkOrderID 6,因爲所有的作業(作業ID == 1和2)根據WorkOrderID == 6,具有StatusID == 9

它將返回兩個結果WorkOrderID 6,7

現在,這將返回WorkOrderID 6按你的requirnment

SELECT q.* FROM (
SELECT w.`WorkOrderID`, 
(SELECT 
GROUP_CONCAT(`jobID` SEPARATOR ',') FROM `jobs` WHERE `jobs`.`WorkOrderID`=w.`WorkOrderID` GROUP BY `jobs`.`WorkOrderID`) AS Alljobids 
, GROUP_CONCAT(j.`jobID` SEPARATOR ',') AS onlystatusids 
FROM `workorders` w INNER JOIN `jobs` j ON (w.`WorkOrderID` = j.`WorkOrderID`) 
INNER JOIN `jobs_status` js ON (j.`jobID` = js.`jobID`) WHERE js.`StatusID`=9 

GROUP BY w.`WorkOrderID`) q WHERE q.Alljobids=q.onlystatusids 

下面是使用HAVING

012的另一種方式
SELECT w.`WorkOrderID`, 
(SELECT 
GROUP_CONCAT(`jobID` SEPARATOR ',') FROM `jobs` WHERE `jobs`.`WorkOrderID`=w.`WorkOrderID` GROUP BY `jobs`.`WorkOrderID`) AS Alljobids 
, GROUP_CONCAT(j.`jobID` SEPARATOR ',') AS onlystatusids 
FROM `workorders` w INNER JOIN `jobs` j ON (w.`WorkOrderID` = j.`WorkOrderID`) 
INNER JOIN `jobs_status` js ON (j.`jobID` = js.`jobID`) WHERE js.`StatusID`=9 
GROUP BY w.`WorkOrderID` 
HAVING Alljobids=onlystatusids 

這裏是你的Fiddle Example如果你不相信:)

+0

這就是我不想要的結果。 WorkOrderID == 6有兩個作業(都具有StatusID == 9,因此WorkOrderID == 6已完成)並應打印,並且對於WorkOrderID == 7其作業ID爲JobID == 4的其中一個作業ID的StatusID不等於9 (還沒有完成),所以不應該被提取。 –

+0

@sajidkhan檢查我的更新回答 –

+0

你只是搖滾人!非常感謝 –

2

去想這樣的問題(在我看來)最好的辦法是在三個部分佈局查詢:一個SELECT部分列出所需列,部分顯示所需的表和JOIN條件,以及其中部分用於子集所需的數據行。

所以,從你的問題的描述,也許這將工作:是,我已經聯接條件表Status

SELECT WorkOrders.WorkOrderID 

FROM WorkOrders 
JOIN Jobs 
ON Jobs.WorkOrderID = WorkOrders.WorkOrderID 
JOIN Jobs_Status 
ON Jobs_Status.JobID = Jobs.JobID 
JOIN Status 
ON Status.StatusID = Jobs_Status.StatusID 

WHERE Jobs_Status.StatusID = 9 

通知,但我只是做,爲了說明。實際上加入這張桌子是沒有必要的(Jobs_Status的價值已經足夠好了。

+0

這會打印兩行(WorkOrderID 6,7)。我不想獲取WorkOrderID 7,因爲它的一個JoID的StatusID == 1(JobID,4)。 –

相關問題