MySQL查询条件意味着更多

时间:2015-02-17 23:31:59

标签: mysql

我想提取一个来自“土地”的村庄的通讯送货地址。不包括“人”中已知居民的表格。有电子邮件地址email或已经死亡的表(class =' D')。所有地址都是已知但不是所有居民。我试过了:

$delQuery=
SELECT streetNum, streetName 
FROM land 
LEFT JOIN person ON land.personID=person.personID 
WHERE (
    email='' 
    OR email IS NULL
) AND class<>'D'.

输出排除class为空的所有地址,即未上市居民的地址。如果我创建了最后一个条件:AND(类&lt;&gt;&#39; D&#39; OR类IS NULL),查询工作正常。 class的默认值为NULL。似乎班级&lt;&gt;&#39; D&#39;意味着类不为null的另一个条件。为什么呢?

1 个答案:

答案 0 :(得分:0)

根据我的评论要求澄清......失败是由于您尝试使用左连接,但随后添加明确查找值的WHERE子句。通过不测试NULL将其转回INNER JOIN。

将您的符合条件的条件直接置于加入级别以限制您执行/不希望的操作是完全合法的。修改了原始查询以保留左连接条件。我只是改用别名&#34; L&#34;和&#34; P&#34;为了提高可读性,并且这是一个很好的习惯,所以请求帮助,没有人需要猜测哪些列与哪些表源相关联。限定所有列。

SELECT 
      L.streetNum, 
      L.streetName 
   FROM 
      land L
         LEFT JOIN person P
            ON L.personID = P.personID 
           AND ( (  P.email IS NULL  OR P.email='' ) 
                AND P.class <> 'D' )

因此,由于您的标准的其他部分只是在人身上,我将这些元素移动到左连接。因此,上述SQL的结构方式,无论一个人如何,您都可以获得所有的土地位置。

如果您想要的只是那些与土地相关的人员(需要该部分),但也有一封有效的电子邮件(非空白/空)并且没有死亡,您需要拉出那部分进入哪里,但是你需要把它留在哪里,但是让我们试着真正知道被问到的是什么。由于我仍然没有从您的查询中得到您想要的内容,因此下面的查询将获得所有记录,这些记录至少要通过人员记录(P.PersonID IS NOT NULL)。从那以后,只包括那些没有电子邮件并且没有或没有死亡的人&#39; D&#39;这个班的旗帜。

SELECT 
      L.streetNum, 
      L.streetName 
   FROM 
      land L
         LEFT JOIN person P
            ON L.personID = P.personID 
   WHERE
          P.PersonID IS NOT NULL
      AND ( 
             (  P.email IS NULL  OR P.email='' ) 
            AND P.class IS NOT NULL 
            AND P.class <> 'D' ))