我使用下面的代码提取信息,这非常正常。
我需要在不影响它的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
所以我的意思是:
这是第一个查询的结果
这是来自没有AND ctp.contractorID = 1部分的查询的结果。我需要提取的代码:
我试过MINUS但phpMyAdmin却没有接受它。我已经调查了NOT IN,但我似乎无法解决这个问题。
答案 0 :(得分:1)
首先,left join
是不必要的,因为后续的加入条件和where
子句将其转换为inner join
。
您的问题是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