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語句內部票數的百分比
順便說一下,在什麼類型%整數應存放在數據庫中?
感謝您的幫助!
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語句內部票數的百分比
順便說一下,在什麼類型%整數應存放在數據庫中?
感謝您的幫助!
你不說你使用的是什麼數據庫(Postgresql,Mysql,Oracle ..等等),但是如果你使用Mysql,你可以使用TinyInt datatype。無論如何,你的四捨五入數,並假設你的百分比將始終在0和100之間,你會沒事的。
您的問題似乎是,你沒有任何的測試數據,所以你無法測試您的查詢的語法。但這是一個問題,你可以很容易地解決自己,它甚至不需要那麼長時間:
只是組成一些數據,並用它來測試。
這並不難,因爲它聽起來。例如,我在這裏創建了兩個民意調查,其中第一個有四票,其中第二個有兩票。然後,我嘗試使用您的查詢向投票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)
。你可能要重新考慮你的表設計,避免冗餘數據。考慮normalizing your table structure。如果你這樣做,那麼我上面列出的所有問題都將得到解決,你的陳述將變得更加簡單。
祝你好運!
它看起來很奇怪。喜歡看'votes' ='votes' + 1 – Incognito 2010-05-23 11:12:58
:(好,但至少是語法看起來不錯? – Somebody 2010-05-23 11:14:21
你的數據庫服務器會告訴你,如果語法是有效的。如果你甚至沒有數據呢,何苦編寫更新聲明?請生成一些測試數據,並在遇到* real *問題時再回來。 – Tomalak 2010-05-23 11:19:52