如何编写排除某些结果的查询,但包含缺少用于排除的关联的结果?

时间:2009-05-12 20:02:36

标签: sql mysql

我有一个用于查询服务条款的搜索表单,我称之为“条款”。规定可能具有某些资格要求并属于许多关系,但它们也可能根本没有要求。我的问题是,当我根据特定要求排除某些条款时,那些完全没有要求的条款也被排除在外。

表格结构:

provisions
* id
* title

requirements
* id
* title

provisions_requirements
* provision_id
* requirement_id

假设要求如下:

Canadian Citizenship (id 4)

这将在以下表格中列出:“排除有以下要求的服务:加拿大公民身份”。

查询的排他性部分因此是:

requirements.id NOT IN (4)

但是,我只能获得至少有一项要求的条款,因为那些没有要求的条款不包括在加入中。

实际查询如下:

SELECT DISTINCT `provisions`.id 
FROM `provisions` 
LEFT OUTER JOIN `provisions_requirements` 
  ON `provisions_requirements`.provision_id = `provisions`.id 
LEFT OUTER JOIN `requirements` 
  ON `requirements`.id = `provisions_requirements`.requirement_id 
WHERE (requirements.id NOT IN ('1')) 
LIMIT 0, 10

4 个答案:

答案 0 :(得分:3)

所以你想要所有服务除了那些有加拿大公民身份要求的服务(req_id 4)?

试试这个:它尝试以匹配requirement_id的4,但是WHERE子句中的条件使得只有这样的条款才会发现没有这样的匹配满足条件。

SELECT p.id
FROM provisions p LEFT OUTER JOIN provisions_requirements r
 ON (p.id = r.provision_id AND r.requirement_id IN (4))
WHERE r.requirement_id IS NULL
LIMIT 0, 10;

不需要DISTINCT。不需要加入requirements表。

答案 1 :(得分:1)

SELECT
     P.id
FROM
     Provisions P
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
               Provision_Requirements PR
          WHERE
               PR.provision_id = P.id AND
               PR.requirement_id = 4
     )

答案 2 :(得分:-1)

试试这个:

SELECT DISTINCT `provisions`.id 
FROM `provisions` 
LEFT OUTER JOIN `provisions_requirements` ON `provisions_requirements`.provision_id = `provisions`.id 
LEFT OUTER JOIN `requirements` ON `requirements`.id = `provisions_requirements`.requirement_id and (requirements.id NOT IN ('1'))
LIMIT 0, 10

答案 3 :(得分:-1)

你的查询在99%那里,还包括一个NULL的测试

SELECT DISTINCT `provisions`.id 
FROM `provisions` 
LEFT OUTER JOIN `provisions_requirements` 
  ON `provisions_requirements`.provision_id = `provisions`.id 
LEFT OUTER JOIN `requirements` 
  ON `requirements`.id = `provisions_requirements`.requirement_id 
WHERE (requirements.id NOT IN ('1')) 
or requirements.id is NULL -- test for null
LIMIT 0, 10

这将包括那些在provisions_requirements表中没有条目的行