计算mysql语句中的投票百分比

时间:2010-05-23 11:10:49

标签: sql 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=?

还没有表数据,要正确测试它。 :)

顺便说一句,%整数应该存储在数据库中什么类型?

感谢您的帮助!

2 个答案:

答案 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}}。
  • 2的百分比未更新,导致民意调查1的总百分比大于100。
  • 您可能甚至不应该将百分比存储在数据库中。而不是坚持这个值,只考虑在你需要时即时计算它。

您可能需要重新考虑表格设计以避免冗余数据。考虑normalizing your table structure。如果你这样做,那么我上面列出的所有问题都将得到解决,你的陈述将更加简单。

祝你好运!