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

Logical condition in WHERE - Incorrect results

Dataset: (只高亮错误条件数据,其他条件正常)

查询:

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'

查询returns无结果。

我不明白这个查询有什么问题。

Here is the fiddle.

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'

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

试试这个

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

如果我考虑SQLfidle中的数据,你的查询是没有问题的。 按照您的逻辑,它应该 return 的唯一行是 parent_type

中包含 NULL 值的行

MySQL 逻辑与您的不同: 当您使用 <> 或 != 运算符时,NULL 将被省略并且永远不会 returned。 如果您还想获得 NULL,请执行:

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

或这个

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