2013-05-08 29 views
1

我有一個查詢,updated從另一個表table1中一排COUNT(*) -從表1計數更新table1時數爲空

UPDATE t1 
SET a=(SELECT COUNT(b) FROM t2 WHERE c=10 GROUP BY c)) 
WHERE id=20 

的問題是,如果有在用C t2爲沒有條目 = 10,查詢本身失敗,因爲SELECT返回null或什麼也沒有。即使子選擇語句返回null,是否有辦法使此工作成爲可能?

P.S.我嘗試過使用IFNULL,但看起來像那也行不通。

+0

'SELECT COUNT(b)FROM t2 WHERE c = 10 GROUP BY c UNION ALL select 0 limit 1'?我完全只是把它拉出我的**所以讓我知道 – gillyspy 2013-05-08 19:05:17

+0

謝謝@Gillyspy,eggyal的解決方案工作,所以一起去吧。謝謝您的幫助。 – arunskrish 2013-05-09 04:26:10

回答

1

一個MySQL的許多好奇的是,如果一個下降的GROUP BY條款(MySQL將隱含組中的所有行,如果聚合函數是在沒有明確的GROUP BY條款的使用),它總是甚至返回彙總結果如果沒有基礎記錄;在COUNT()功能的情況下,它返回所希望的0結果:

UPDATE t1 SET a=(SELECT COUNT(*) FROM t2 WHERE c=10) WHERE id=20 

查看它sqlfiddle

+0

如果你可以讓你的答案更直接地與它會提供幫助的問題相關。所有這些都是關於連接點的答案,不僅僅是創造更多的點 – gillyspy 2013-05-08 19:12:23

+0

@gillyspy:我看不出這個答案與問題沒有直接關係。它甚至包括一個更正代碼的明確例子。感謝您提出的改進建議。 – eggyal 2013-05-08 19:14:38

+0

我現在可以看到它,你擺弄它。它使用了「它」,所以我經常忘記它想說的是什麼。爲它+1。 – gillyspy 2013-05-08 19:17:08

1

控制空值由IFNULL:

UPDATE t1 SET a=IFNULL ( 
    (SELECT COUNT(b) FROM t2 WHERE c=10 GROUP BY c),0) 
WHERE id=20 

,或者你可以使用這個,如果第二選擇的結果可能是空的:

UPDATE t1 SET a= if(exists(SELECT * FROM t2 WHERE c=10 GROUP BY c)) ,(SELECT COUNT(b) FROM t2 WHERE c=10 GROUP BY c),0) 
WHERE id=20 
+0

這就是我實際上做的 – gillyspy 2013-05-08 19:10:45

+0

理由我會這樣做是因爲,一般來說,依靠一個奇怪的東西並不好。但是,如果它讓你感覺像忍者那麼niiiiinja-去! – gillyspy 2013-05-08 19:27:30

0

嘗試使用COALESCE

UPDATE t1 
SET a=COALESCE((SELECT COUNT(b) FROM t2 WHERE c=10 GROUP BY c),0) 
WHERE id=20 

Refernce