2015-04-21 129 views
0

所以我有兩個表academy_attempt & module_attemptSQL:和返回null

我試圖從每個表中添加兩個值加在一起:

 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

我懷疑是有更清晰的方式來做你想要的計算,一個不涉及'select'子句中的多級子查詢。 –

+0

@GordonLinoff不確定是否存在:S它的意思是我不能使用union –

回答

2

您必須應用IFNULL()上漲,因爲一個空的結果集被認爲是null

SELECT (... 
) + IFNULL((SELECT SUM(`module_attempt`.`score`) ...), 0) AS total_score 
1

NULL表示未知值,所以自然想一個未知的值添加到數仍然導致一個未知的值,儘管是一個不同的未知值(因此NULL != NULL

我想你實際上想要COALESCE函數,它返回第一個非空參數。因此,你可以用這個函數來包裝你的空值,並將其作爲正常值進行求和。 COALESCE(NULL, 0)將返回0,並且COALESCE(1,0)返回1

https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

+0

'IFNULL()'以相同的方式工作,只是它只接受兩個參數,而'COALESCE()'接受更多。 –

+0

@stwalkerster可悲的是這不起作用:s –