Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算mysql语句中的投票百分比_Sql_Mysql - Fatal编程技术网

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

计算mysql语句中的投票百分比,sql,mysql,Sql,Mysql,还没有表数据,无法正确测试它。:) 顺便问一下,数据库中应该以何种类型存储%整数 谢谢你的帮助 你没有说你用的是什么数据库(Postgresql、Mysql、Oracle等等),但是如果你用的是Mysql,你可以不使用数据库。不管怎样,四舍五入到整数,并且假设百分比始终在0到100之间,就可以了。您的问题似乎是没有任何测试数据,因此无法测试查询的语法。但这是一个你可以自己轻松解决的问题,甚至不用花那么长时间: 只需编造一些数据并使用这些数据进行测试即可 这并不像听起来那么难。例如,我在这里创建了

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

顺便问一下,数据库中应该以何种类型存储%整数


谢谢你的帮助

你没有说你用的是什么数据库(Postgresql、Mysql、Oracle等等),但是如果你用的是Mysql,你可以不使用数据库。不管怎样,四舍五入到整数,并且假设百分比始终在0到100之间,就可以了。

您的问题似乎是没有任何测试数据,因此无法测试查询的语法。但这是一个你可以自己轻松解决的问题,甚至不用花那么长时间:

只需编造一些数据并使用这些数据进行测试即可

这并不像听起来那么难。例如,我在这里创建了两个投票,第一个有四票,第二个有两票。然后,我尝试使用您的查询将投票添加到投票1的选项1

    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=?
结果如下:

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;
您可以看到存在许多问题:

  • polls
    表尚未更新,因此poll 1的总票数是错误的(4而不是5)。请注意,您甚至不需要此表-它复制了在
    polls\u options
    表中已经找到的相同信息。让这两个表保持同步是额外的工作。如果出于某种原因需要调整结果,例如删除一些垃圾邮件投票,则必须记住更新两个表。这是不必要的额外工作和额外的错误来源
  • 即使您记得先更新
    投票
    表,选项1的百分比仍然计算不正确:它被计算为3/5而不是2/5,因为它实际上是在进行此计算:
    ((投票+1)+1)
  • 2的百分比未更新,导致轮询1的总百分比大于100
  • 您甚至不应该将百分比存储在数据库中。而不是坚持这个值,只考虑在需要的时候计算它。
您可能需要重新考虑表设计,以避免冗余数据。考虑如果你这样做,那么我上面列出的所有问题都会得到解决,你的陈述也会简单得多


祝你好运

我觉得很奇怪。希望看到
投票
=
投票
+1:(好的,但至少语法看起来很好吗?您的数据库服务器会告诉您语法是否有效。如果您甚至还没有数据,为什么还要麻烦编写update语句?请生成一些测试数据,遇到实际问题时返回。
poll_id option_id votes percent
1       1         2     75
1       2         3     75
2       1         1     50
2       2         1     50