2011-03-15 81 views
1

我有一個2表,其中我有組,另一個我設置用戶限制哪些組被看到。 當我做LEFT JOIN並指定沒有條件時,它會顯示我所有的記錄。當我做WHERE group_hide.hide!='true'時,它只顯示這些記錄具有設置給它們的錯誤枚舉類型。使用JOIN,其他組將隱藏字段設置爲「NULL」。 我該如何做到這一點,以便它只排除設置爲true的這些設置,並顯示其他任何有NULL或false的內容?mysql:'WHERE something!= true'排除NULL的字段

+0

是的,是的,它的確如此。 – Ben 2011-03-15 09:30:36

回答

6

在MySQL中,當處理可爲空的值時,您必須使用IS NULLIS NOT NULL

這裏你應該用(group_hide.hide IS NULL OR group_hide.hide != 'true')

+2

請參見手冊中的[使用NULL值](http://dev.mysql.com/doc/refman/5.5/en/working-with-null.html)。 – 2011-03-15 09:31:12

0

一個明顯的答案是:

WHERE (group_hide.hide is null or group_hide.hide ='false') 

我不知道把我的頭頂部有什麼空的行爲規則。

1

Don已經爲您提出的問題提供了很好的答案,並將解決您的直接問題。

但是,讓我解決錯誤的數據類型域的點。通常你會讓hide成爲BOOLEAN,但是mysql並沒有完全實現它。它將它轉換爲TINYINT(1),允許從-128到127的值(請參閱mysql的data types概述)。由於mysql不支持CHECK約束,因此您可以選擇使用觸發器或外部引用來正確執行域。

以下是與錯誤的數據域(你的情況)的問題,按重要性排序:

  • 允許一個字段NULL,可以是缺點只有1或0,你必須僱用3 value logic (true,false,null),這在btw中沒有完美實現。這使得某些查詢更復雜較慢然後他們需要。如果你可以創建一個列NOT NULL,那麼。
  • 對於只能有1或0的字段使用VARCHAR的缺點是查詢的速度,這是由於額外的I/O和更大的存儲需求(減慢讀取,寫入操作,使字段更大索引的一部分並影響備份的大小;請記住,這些效果可能會引起錯誤域單一字段爲較小尺寸表,但如果數據類型一致地設置太大或者如果表格有嚴重數量的記錄,效果將會咬人)。此外,您將始終需要將VARCHAR轉換爲1或0以使用自然的mysql布爾運算符,從而增加查詢的複雜性。
  • 對於BOOL,使用TINYINT(1)的缺點是RDBMS允許某些值不允許使用,理論上允許將無意義的值存儲在系統中。在這種情況下,您的應用程序層必須保證數據的完整性,如果RDBMS保證完整性,它會保護您免受應用程序層中的某些錯誤以及數據庫管理員可能犯的錯誤。