我在尝试总结投票 AND downvotes时意识到了这个问题,因为downvote的值是-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
来总结和减少投票的SQL查询是什么样的。
答案 0 :(得分:4)
我个人会使用-1
,0
和1
。
但是,0
,NULL
和1
也可以投放使用:
SELECT SUM(vote * 2 - 1) ...
答案 1 :(得分:2)
所以问题是:在计算聚合函数时是否排除NULL
?
答案是肯定的。 Wikipedia's article on NULL values州:
SQL定义聚合函数以简化服务器端聚合 数据计算。几乎所有聚合函数都执行a 空消除步骤,使Null值不包括在内 最终的计算结果。这种隐含的Null消除, 但是,会对聚合函数结果产生影响。
因此,对于要从0
聚合函数中排除的值,您是NULL
还是SUM
无关紧要。
答案 2 :(得分:1)
在oracle中它将是
SUM( decode( vote,0,-1,vote ))
答案 3 :(得分:1)
简单计算会将投票列值更改为-1和+1。
SUM( 2*(vote-0.5))
或者取两者之间的数量差异。
SELECT (SELECT COUNT(*) FROM tbl WHERE vote = 1)
-(SELECT COUNT(*) FROM tbl WHERE vote = 0)
答案 4 :(得分:1)
我认为你绝对应该使用1,0和-1。它让一切变得更轻松。您也可能无法使用单个位字段保存任何空间,因此没有充分的理由尝试在此处使用它。
答案 5 :(得分:1)
你也可以使用CASE
这样的东西 - 我在SQL Server中做了很多,并假设它在MySQL中也应该有效:
SELECT
SUM(CASE WHEN Vote = 0 THEN -1 ELSE VOTE END) as 'Votes'
FROM
MyTable
答案 6 :(得分:-1)
select count (*) from table where vote <> 1
(数量为-1)
select count (*) from table where vote = 1
(金额为1)