SQL减去另一行的查询行

时间:2014-03-31 12:33:20

标签: mysql sql

我使用下面的代码提取信息,这非常正常。

我需要在不影响它的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. 这是第一个查询的结果

    1. 第1行
    2. 第2行
    3. 第3行
    4. 这是来自没有AND ctp.contractorID = 1部分的查询的结果。我需要提取的代码:

      1. 第2行
      2. 第3行
      3. 我试过MINUS但phpMyAdmin却没有接受它。我已经调查了NOT IN,但我似乎无法解决这个问题。

1 个答案:

答案 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