我在下面的查询中使用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。
查询的预期结果
结果我
我只想要子查询返回一个空值。然后查询(Notification.id,(SELECT read_ids FROM read_notifications WHERE user_id)= 46)结果看起来像
(`Notification`.`id`,(0))
而不是
(`Notification`.`id`,())
所以它会正常工作
请告诉我这需要哪些改进。
由于
答案 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 NULL和NOT NULL is still NULL, as is NULL AND 1, and NULL is equivalent to false。因此,当子查询返回NULL时,WHERE条件将失败。
通过在子查询结果周围添加一个IFNULL,您可以让它返回一个对FIND_IN_SET有效的值,这将允许您的查询按预期工作。