WHERE中的逻辑条件 - 结果不正确

时间:2016-03-10 13:57:16

标签: mysql sql where

数据集: (只需突出显示错误条件数据,其他条件正常)

enter image description here

查询:

SELECT  `id`,   `uid`,  `activity_type`,    `source_id`,    `parent_id`,    `parent_type`,  `post_id`,  `status`
FROM    `user_activity` AS `user_activity`
WHERE
    `user_activity`.`activity_type` IN(
        'STATUS_UPDATE',
        'PROFILE_PICTURE_UPDATED',
        'PROFILE_COVER_UPDATED',
        'ALBUM'
    )
AND `user_activity`.`uid` = '13'
AND `user_activity`.`status` = 'ACTIVE'
-- AND `user_activity`.`parent_type` <> 'ALBUM' -- query works wihtout this condition
ORDER BY    id DESC LIMIT 10

查询工作正常并获得所需的结果,但是当我添加条件时:

AND `user_activity`.`parent_type` <> 'ALBUM'

查询不返回任何结果。

我不明白这个查询中的问题是什么。

Here is the fiddle.

4 个答案:

答案 0 :(得分:4)

SQL使用three valued logic。 NULL&lt;&gt; 'ALBUM'和NULL ='ALBUM'都评估为UNKNOWN。您需要使用IS NOT NULL或IS NULL来与空值进行比较。

答案 1 :(得分:3)

user_activity.parent_type <> 'ALBUM'条件还会过滤该列上的每个NULL值,因为NULL <> 'ALBUM'不是true,而是undetermined。所以你可以使用这样的东西:

AND (`user_activity`.`parent_type` <> 'ALBUM' OR `user_activity`.`parent_type` IS NULL)

或者:

AND COALESCE(`user_activity`.`parent_type`,'') <> 'ALBUM'

答案 2 :(得分:1)

试试这个

SELECT  `id`,   `uid`,  `activity_type`,    `source_id`,    `parent_id`,    `parent_type`,  `post_id`,  `status`
FROM    `user_activity` AS `user_activity`
WHERE
    `user_activity`.`activity_type` IN(
        'STATUS_UPDATE',
        'PROFILE_PICTURE_UPDATED',
        'PROFILE_COVER_UPDATED',
        'ALBUM'
    )
AND `user_activity`.`uid` = '13'
AND `user_activity`.`status` = 'ACTIVE'
AND IFNULL(`user_activity`.`parent_type`,'') <> 'ALBUM'
ORDER BY    id DESC LIMIT 10

答案 3 :(得分:1)

如果我考虑SQLfidle中的数据,那么查询中没有问题。 根据您的逻辑,它应该返回的唯一行是parent_type中包含NULL值的行

MySQL逻辑与你的不同: 当您使用&lt;&gt;时或!=运算符,省略NULL并且永远不会返回。 如果您还想获得NULL,请执行:

AND (`user_activity`.`parent_type` <> 'ALBUM' OR `user_activity`.`parent_type` IS NULL)

或者

AND coalesce(`user_activity`.`parent_type`,'whateveryouwanthere') <> 'ALBUM'