空结果上的SELECT查询返回错误

时间:2018-04-09 11:02:13

标签: mysql sql

我在下面的查询中使用SELECT查询作为子查询...

SELECT COUNT (`Notification`.`id`) AS `count`
FROM `listaren_mercury_live`.`notifications` AS `Notification`
WHERE NOT FIND_IN_SET(`Notification`.`id`,(SELECT read_ids FROM read_notifications WHERE user_id = 46))
AND((notisfication_for IN("all","India"))
OR(FIND_IN_SET(46,notification_for))

此查询在

时正常工作
SELECT read_ids FROM read_notifications WHERE user_id = userid)

返回结果,如21,22,23,24

但当此查询返回空时。

结果标识为0,而不是3。用户有3个未读通知;所以结果必须是3

问题

当内部选择查询返回

时,查询会给出正确的结果
12,42 

但是如果查询返回null,则整个查询的结果变为0。

查询的预期结果

Expected Result

结果我

Result I'm getting

我只想要子查询返回一个空值。然后查询(Notification.id,(SELECT read_ids FROM read_notifications WHERE user_id)= 46)结果看起来像

 (`Notification`.`id`,(0))

而不是

(`Notification`.`id`,())

所以它会正常工作

请告诉我这需要哪些改进。

由于

1 个答案:

答案 0 :(得分:1)

尝试替换

FIND_IN_SET(`Notification`.`id`,(SELECT read_ids FROM read_notifications WHERE user_id = 46))

FIND_IN_SET(`Notification`.`id`,IFNULL((SELECT read_ids FROM read_notifications WHERE user_id = 46), ''))

manual开始,如果子查询结果为空,则返回NULL,FIND_IN_SET will return NULL if either argument is NULLNOT NULL is still NULL, as is NULL AND 1, and NULL is equivalent to false。因此,当子查询返回NULL时,WHERE条件将失败。

通过在子查询结果周围添加一个IFNULL,您可以让它返回一个对FIND_IN_SET有效的值,这将允许您的查询按预期工作。