2010-05-23 39 views
2
UPDATE polls_options SET `votes`=`votes`+1, `percent`=ROUND((`votes`+1)/(SELECT voters FROM polls WHERE poll_id=? LIMIT 1) * 100,1) 
    WHERE option_id=? 
    AND poll_id=? 

還沒有表數據,要正確測試。 :)計算mysql語句內部票數的百分比

順便說一下,在什麼類型%整數應存放在數據庫中?

感謝您的幫助!

+0

它看起來很奇怪。喜歡看'votes' ='votes' + 1 – Incognito 2010-05-23 11:12:58

+0

:(好,但至少是語法看起來不錯? – Somebody 2010-05-23 11:14:21

+0

你的數據庫服務器會告訴你,如果語法是有效的。如果你甚至沒有數據呢,何苦編寫更新聲明?請生成一些測試數據,並在遇到* real *問題時再回來。 – Tomalak 2010-05-23 11:19:52

回答

1

你不說你使用的是什麼數據庫(Postgresql,Mysql,Oracle ..等等),但是如果你使用Mysql,你可以使用TinyInt datatype。無論如何,你的四捨五入數,並假設你的百分比將始終在0和100之間,你會沒事的。

0

您的問題似乎是,你沒有任何的測試數據,所以你無法測試您的查詢的語法。但這是一個問題,你可以很容易地解決自己,它甚至不需要那麼長時間:

只是組成一些數據,並用它來測試

這並不難,因爲它聽起來。例如,我在這裏創建了兩個民意調查,其中第一個有四票,其中第二個有兩票。然後,我嘗試使用您的查詢向投票1的選項1添加投票。

CREATE TABLE polls_options (
    poll_id INT NOT NULL, 
    option_id INT NOT NULL, 
    votes INT NOT NULL, 
    percent FLOAT NOT NULL 
); 
INSERT INTO polls_options (poll_id, option_id, votes, percent) VALUES 
(1, 1, 1, '25'), 
(1, 2, 3, '75'), 
(2, 1, 1, '50'), 
(2, 2, 1, '50'); 

CREATE TABLE polls (poll_id INT NOT NULL, voters INT NOT NULL); 
INSERT INTO polls (poll_id, voters) VALUES 
(1, 4), 
(2, 2); 

UPDATE polls_options 
SET votes = votes + 1, 
    percent = ROUND((votes + 1)/(SELECT voters FROM polls WHERE poll_id = 1 LIMIT 1) * 100,1) 
WHERE option_id = 1 
AND poll_id = 1; 

SELECT * FROM polls_options; 

下面是結果:

poll_id option_id votes percent 
1  1   2  75 
1  2   3  75 
2  1   1  50 
2  2   1  50 

你可以看到,有許多問題:

  • polls表還未被更新,所以總投票數爲輪詢1是錯誤的(4而不是5)。請注意,你甚至不需要這張表 - 它重複了在polls_options表中已經找到的相同信息。讓兩個表保持同步是額外的工作。如果您出於某種原因需要調整結果,例如要刪除一些垃圾郵件投票,則必須記住要更新這兩個表。這是不必要的額外工作和額外的錯誤來源。
  • 即使您已經記得先更新polls表,但選項1的百分比仍然錯誤地計算出來:它計算爲3/5而不是2/5,因爲它實際上正在執行此計算:((votes + 1) + 1)
  • 2的百分比未更新,導致輪詢1的總百分比大於100.
  • 您可能甚至不應該將百分比存儲在數據庫中。不要堅持這個價值,只要在需要的時候就考慮計算它。

你可能要重新考慮你的表設計,避免冗餘數據。考慮normalizing your table structure。如果你這樣做,那麼我上面列出的所有問題都將得到解決,你的陳述將變得更加簡單。

祝你好運!