1

在此处输入图像描述

从上到下WorkOrderID 有很多JobID,每个JobID 都有一些StatusID。我只想获取每个 JobID 的 StatusID == 9 的 WorkOrderID 记录。

根据表中给出的数据,我只想获取一个用于 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 尚未完成。

让表的名称从上到下。WorkOrders ,工作, Jobs_Status ,状态

4

2 回答 2

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所以WorkOrderID反对jobID (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

这是你的小提琴例子如果你不相信:)

于 2013-06-30T19:29:41.110 回答
2

考虑此类问题的最佳方法(在我看来)是将查询布局为三个部分:列出所需列的SELECT部分,显示所需表和 JOIN 条件的 FROM 部分,以及WHERE部分用于对您需要的数据行进行子集化。

因此,根据您对问题的描述,也许这会起作用:

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

请注意,我已将 JOIN 条件包含到表中Status,但我这样做只是为了说明。实际上加入该表是没有必要的(来自的值Jobs_Status足够好。

于 2013-06-30T19:30:23.160 回答