我用下面的代码提取信息,效果非常好。
我需要在不影响contractorID的情况下提取数据,然后从中减去第一个查询中的行。
SELECT
DISTINCT a.addID
, p.propdetailID
, p.plotID
FROM address AS a
LEFT JOIN propdetail AS p ON (a.addID = p.addID)
JOIN housebuildertoproperty AS htp ON (htp.addID = p.addID)
JOIN contractortopropdetail AS ctp ON (ctp.propdetailID = p.propdetailID)
WHERE htp.housebuilderID = 1
AND ctp.contractorID = 1
所以我的意思是:
- 第 1 行
这是第一个查询的结果
- 第 1 行
- 第 2 行
- 第 3 行
这是没有 AND ctp.contractorID = 1 部分的查询结果。我需要可以提取的代码:
- 第 2 行
- 第 3 行
我尝试了 MINUS 但 phpMyAdmin 不接受它。我已经研究过 NOT IN 但我似乎无法弄清楚这一点。
最佳答案
首先,左联接
是不必要的,因为后续联接条件和where
子句将其变成内联接
。
您的问题是,contractorID = 1
上的某些地址有其他承包商。解决方案是使用 group by
而不是 distinct
并使用 having
子句来过滤承包商 1 的地址:
SELECT a.addID, p.propdetailID, p.plotID
FROM address a JOIN
propdetail p
ON (a.addID = p.addID) JOIN
housebuildertoproperty htp
ON (htp.addID = p.addID) JOIN
contractortopropdetail ctp
ON (ctp.propdetailID = p.propdetailID)
WHERE htp.housebuilderID = 1
GROUP BY a.addID, p.propdetailID, p.plotID
HAVING SUM(ctp.contractorID = 1) = 0
关于mysql - SQL 从另一行中减去查询行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22761656/