2012-03-29 70 views
0

繞過請看下面的「用戶」表:添加+1查詢「被零除」錯誤

uid followers following ff_fraction 
-------------------------------------- 
1 40   2   20 
2 10   3   3 
3  0   2   0 
4  5   0   5 
5 77   2 
6  9   3 

我想計算,爲每一個用戶,追隨者的分數/以下,四捨五入到一個整數。我填充在表頭4名的用戶:

  1. 40/2 = 20
  2. 10/3 = 3.3333 =>四捨五入3
  3. 0/2 = 0
  4. 5/0 =>這會給出一個錯誤,所以我計算+1,使得5/1 = 5

我現在有以下查詢,但它沒有考慮「跟隨」爲零(並且它因此將不得不加1以免錯誤發生):

UPDATE users SET ff_fraction = ROUND(followers/following) 

是否有可能在MySQL查詢中解決這個問題?

+0

如果你的主要目標是避免被零誤差除數,你應該在分子和分母都加1。這被稱爲拉普拉斯平滑。 – damned 2012-03-29 12:23:33

回答

1

你可以做到以下幾點:

UPDATE users SET ff_fraction = ROUND(followers/if(following>0,following,1)) 
+0

工程就像一個魅力,謝謝! – Pr0no 2012-03-29 12:35:28

+0

雖然這個函數有訣竅,但我發現這種情況由於數量和變量較少而更易於使用GREATEST。 – 2012-03-29 12:39:44

+0

@reveller,Robin是對的,並且取決於您期望的結果,並且如果您使用的是有符號整數或不使用,這可能會影響您的答案。如果你的專欄總是正面的,那麼上面的內容就可以工作。您甚至可能想要分析兩個查詢以確保最佳性能。如果你需要考慮負面的價值,那麼看看safarov和guffa的答案吧 – Simon 2012-03-29 13:59:31

0
UPDATE users 
SET ff_fraction = if(following = 0, followers, ROUND(followers/following)) 
2
UPDATE users SET ff_fraction = ROUND(followers/GREATEST(following, 1)) 

GREATEST將使所以這不會低於1

2

可以使用case表達完全規避師:

update users 
set ff_fraction = 
    case following when 0 then followers else round(followers/following) end