3

我在尝试对赞成票和反对票求和时意识到了这个问题,因为反对票的值为 -1 而不是 0。这在使用 SQL sum() 函数时会导致问题。例如,

vote_id   vote
  1        0
  2        1
  3        1

SELECT sum(vote) //output is 2

vote_id   vote
  1       -1
  2        1
  3        1

SELECT sum(vote) //output is 1, which is the desired output

我想首先,我的问题是,使用是否0, null, and 1有意义?还是我应该只使用-1, 0, 1

无论如何,我很想知道使用0, null, and 1.

4

7 回答 7

4

我个人会使用-1,01.

但是,0NULL1可以工作:

SELECT SUM(vote * 2 - 1) ...
于 2012-05-04T15:33:15.563 回答
2

所以问题是:计算聚合函数时是否NULL排除?

答案是肯定的。维基百科关于 NULL 值的文章指出:

SQL 定义了聚合函数来简化服务器端对数据的聚合计算。几乎所有聚合函数都执行 Null 消除步骤,因此 Null 值不包含在计算的最终结果中。但是,这种隐式 Null 消除可能会对聚合函数结果产生影响。

因此,您是否愿意0或是否希望从聚合函数中NULL排除值都没有关系。SUM

于 2012-05-04T15:35:18.000 回答
1

在甲骨文中它会是

SUM( decode( vote,0,-1,vote ))
于 2012-05-04T15:32:31.460 回答
1

一个简单的计算将投票列的值更改为 -1 和 +1。

SUM( 2*(vote-0.5))

或者取两者之间的计数差异。

SELECT (SELECT COUNT(*) FROM tbl WHERE vote = 1)
      -(SELECT COUNT(*) FROM tbl WHERE vote = 0)
于 2012-05-04T15:34:10.223 回答
1

我认为您绝对应该使用 1、0 和 -1。它只是让一切变得更容易。您也可能不会使用单个位字段来节省任何空间,因此没有真正好的理由在这里尝试使用它。

于 2012-05-04T15:34:28.377 回答
1

你也可以使用CASE这样的东西——我在 SQL Server 中做了很多,并假设它在 MySQL 中也应该是有效的:

SELECT
   SUM(CASE WHEN Vote = 0 THEN -1 ELSE VOTE END) as 'Votes'
FROM
   MyTable
于 2012-05-04T15:36:52.707 回答
-1

select count (*) from table where vote <> 1(金额为-1)

select count (*) from table where vote = 1(金额为 1)

于 2012-05-04T15:49:08.130 回答