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无结果。
我不明白这个查询有什么问题。
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'
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无结果。
我不明白这个查询有什么问题。
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'