MySQL显示存在于一个表中但不存在于另一个表中的行

时间:2014-02-16 08:20:48

标签: mysql join

我有以下表格:

  1. organisation
    • organisation_idorganisation_name
  2. srp_reseller_buffer
    • organisation_idproperty_id
  3. 我想编写一个MySQL查询,向我显示组织中的所有记录,但srp_reseller_buffer中的记录除外,其中property_id为X

    这是我到目前为止所做的:

    SELECT * FROM organisation
        WHERE NOT EXISTS (
            SELECT * FROM organisation 
                LEFT OUTER JOIN srp_reseller_buffer 
                    ON srp_reseller_buffer.organisation_id = organisation.organisation_id 
                WHERE srp_reseller_buffer.property_id is NULL 
    

    那个SQL查询无效。它只显示了组织表中所有组织的列表。

2 个答案:

答案 0 :(得分:4)

一个简单的左连接?

SELECT organisation.*
FROM organisation
LEFT JOIN srp_reseller_buffer ON
    (organisation.organisation_id = srp_reseller_buffer.organisation.id AND property_id = 'X')
WHERE srp_reseller_buffer.organisation_id IS NULL

“右侧”(srp_reseller)上不存在的记录将为空。

答案 1 :(得分:0)

您需要在内部SELECT语句中包含一个条件。

只需查看内部SELECT语句:

SELECT * FROM organisation 
    LEFT OUTER JOIN srp_reseller_buffer 
        ON srp_reseller_buffer.organisation_id = organisation.organisation_id 
   WHERE srp_reseller_buffer.property_id is NULL

这可能会返回至少一条记录没有记录。

现在,由于您没有在外部SELECT语句中包含条件,因此该查询将为organisation表中的每条记录返回完全相同的结果。这应该等同于:

SELECT * FROM organisation
    WHERE NOT EXISTS (<the result from the inner query>)

因为<the result from the inner query>organisation中的所有记录都相同(特别是 为空),你得到整个organisation表。

修改

您可以尝试这样的事情:

SELECT * FROM organisation o
    WHERE NOT EXISTS (
        SELECT * FROM srp_reseller_buffer
            WHERE srp_reseller_buffer.organisation_id = o.organisation_id
              AND srp_reseller_buffer.property_id = X
    )