2015-02-17 86 views
0

我希望从“地”表中提取电子邮件地址为email或已经死亡(class ='D')的已知居民的电子邮件地址。所有地址都是已知的,但不是所有居民。我曾尝试:MySQL查询条件意味着多于

$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(类<>'D'或类IS NULL)查询工作正常。 class的默认值为NULL。看起来类<>'D'意味着类不是空的另一个条件。为什么?

+0

你的问题是wishy-washy。澄清,Class在PERSON表中?另外,你想要什么。你正在寻找空电子邮件和类不'D'。由于这个班是其中的一部分,这就是杀死你的LEFT JOIN,并把它变成一个INNER JOIN。请澄清。 – DRapp 2015-02-17 23:49:33

+0

'class'和'email'都在person表中,我认为应该在WHERE条件中。该查询正常工作,但只有当'class <>'D''(如上)'后面有'OR class IS NULL'时。 'class <>'D'如何排除NULL的实例? – 2015-02-18 06:00:13

回答

0

正如我的评论要求澄清...失败是由于您尝试使用左连接,但是然后添加WHERE子句明确寻找一个值。通过不测试空转它回到一个INNER JOIN。

将您的限定条件直接放入连接级别以限制您的操作/不想操作是完全合法的。修改原始查询以保留左连接条件。我只是改为使用别名“L”和“P”来缩短可读性,进入这样寻求帮助是一个很好的习惯,没有人需要猜测哪些列与哪些表源相关联。限定所有列。

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)来记录一个人的记录。从那以后,只包括那些没有电子邮件,并且有NULL或者不是已故的'D'标志的班级。

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')) 
+0

我想为所有地址提供通讯,除了那些有电子邮件和死者的地址。方案1选择所有地址。备选方案2省略了通过“P.PersonID IS NOT NULL”占用人未知的地址。 (请记住,我们拥有村庄的所有地址,但许多居民是未知的。)您错过了这一点;我的查询工作,但它需要最后一个条件是'类<>'D'或类IS NULL'。我的问题是:为什么'OR类IS NULL'是必需的?换句话说,为什么'class <>'D''排除NULL的实例? – 2015-02-18 20:07:48