所以我有两张桌子academy_attempt
& module_attempt
我试图从这些表中的每一个中添加两个值:
round(((select
sum(`academy_attempt`.`score`)
from
`academy_attempt`
where
((`academy_attempt`.`module_type_id` in (3 , 4, 5, 6))
and (`academy_attempt`.`user_id` = `U`.`id`))) + (select
sum(ifnull(`module_attempt`.`score`, 0))
from
`module_attempt`
where
((`module_attempt`.`module_type_id` in (3 , 4, 5, 6))
and (`module_attempt`.`user_id` = `U`.`id`)))),
2) AS `total_score`
在academy_attempt中满足where语句,并在一行中返回正确的数量(如果它是单独的)但是module_attempt没有任何与where语句匹配的值,因此返回null。
可悲的是,这并没有变成0,因为我猜你不能进行操作:17 + null = 17
而是返回null
。
为了解决这个问题,我尝试了IFNULL
语句,如上所示,但遗憾的是,这并没有解决问题
答案 0 :(得分:2)
您必须将IFNULL()
更高一些,因为空结果集被视为null
:
SELECT (...
) + IFNULL((SELECT SUM(`module_attempt`.`score`) ...), 0) AS total_score
答案 1 :(得分:1)
NULL
表示未知值,因此自然地尝试向数字添加未知值仍然会导致未知值,尽管是不同的未知值(因此NULL != NULL
)
我认为你实际上想要COALESCE
函数,它返回第一个非null参数。因此,您可以使用此函数包装null值,并将其与正常值相加。 COALESCE( NULL, 0 )
将返回0
,COALESCE(1,0)
将返回1
https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce