首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL查询条件暗示的不只是陈述的内容

MySQL查询条件暗示的不只是陈述的内容
EN

Stack Overflow用户
提问于 2015-02-18 07:31:59
回答 1查看 63关注 0票数 0

我想从'land‘表中提取一个村庄的时事通讯递送地址,不包括'person’表中电子邮件地址为email或已经死亡(class='D')的已知居民。所有地址都是已知的,但并非所有居民都知道。我试过了:

代码语言:javascript
复制
$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 ( class <>'D‘OR class IS NULL),查询就可以正常工作。class的默认值为NULL。似乎class<>'D‘暗示了class不为空的另一个条件。为什么?

EN

Stack Overflow用户

发布于 2015-02-18 20:04:43

根据我要求澄清的评论...失败的原因是您试图使用左连接,但随后添加了WHERE子句显式查找值。通过不测试NULL,可以将其转换回内部连接。

将您的限定条件直接放在联接级别来限制您做什么/不想做什么是完全合法的。您的原始查询已修改,以保留左联接条件。我只是为了更短的可读性而改用别名"L“和"P”,这是一个很好的习惯,所以需要帮助时,没有人需要猜测哪些列与哪些表源相关联。限定所有列。

代码语言:javascript
复制
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' )

因此,由于条件的其他部分只是在person中,所以我将这些元素移到了左侧-join。因此,按照上面SQL的结构方式,您将获得所有陆地位置,而不管是谁。

如果您想要的只是那些确实有一个人与土地相关联的记录(需要该部分),但也有一个有效的电子邮件(非空/空)和未去世的记录,您将需要将该部分放入where,但您将需要将其与where一起保存,但让我们尝试真正了解正在询问的内容。因为我仍然没有从您的查询中得到您想要的东西,所以下面的查询将获得至少包含一个人记录的所有记录(P.PersonID不为空)。从那以后,只包括那些没有电子邮件并且类的'D‘标志为空或没有死亡的人。

代码语言:javascript
复制
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
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28573262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档