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=?
还没有表数据,要正确测试它。 :)
顺便说一句,%整数应该存储在数据库中什么类型?
感谢您的帮助!
答案 0 :(得分:1)
你没有说你正在使用什么数据库(Postgresql,Mysql,Oracle..etc),但如果你使用Mysql,你可以使用TinyInt datatype。无论如何你转向int,假设你的百分比总是在0到100之间,那你就没事了。
答案 1 :(得分: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,因为它实际上是在进行此计算:{ {1}}。您可能需要重新考虑表格设计以避免冗余数据。考虑normalizing your table structure。如果你这样做,那么我上面列出的所有问题都将得到解决,你的陈述将更加简单。
祝你好运!