2011-03-15 82 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保证完整性,它会保护您免受应用程序层中的某些错误以及数据库管理员可能犯的错误。