2015-02-17 87 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