从上到下WorkOrderID有许多JobID,每个JobID都有一些StatusID。
我只想获取每个JobID的StatusID==9的工作订单的记录。
根据表中给出的数据,我只想获取一个结果行,这是针对WorkOrderID 6的,因为WorkOrderID==6下的所有作业(JobID==1和2)的StatusID==9。
JobID==4、5、6、7属于WorkOrderID==7,因此不获取WorkOrderID==7的记录,因为其中一个JobID的StatusID不是9(JobID==4的StatusID==1),从某种意义上说,此WorkOrderID尚未完成。
把桌子的名字从上到下写下来。工单、作业、作业状态、状态

最佳答案

试试看

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,因为WorkOrderID==6下的所有作业(JobID==1和2)的StatusID==9
它将返回两个结果WorkOrderID 6,7
现在这将根据您的要求返回WorkOrderID 6
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
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如果你不相信:)

关于php - 如果满足特定条件,则为以下四个表编写联接查询以获取记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17393763/

10-10 06:53