数据集: (只需突出显示错误条件数据,其他条件正常)
查询:
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'
查询不返回任何结果。
我不明白这个查询中的问题是什么。
答案 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'