在带有负数的ENUM列上使用SUM()

时间:2012-02-12 16:13:57

标签: mysql sql

我想将“voteValue”列中的值限制为-1或1,因此我使用了ENUM数据类型。但是,当我尝试计算投票的总价值(即+1票和-1票)时,我最终得到的每个-1票数为+2而不是减法。

我知道我可以把它分成两个不同的SQL代码来分别获得+1和-1票的SUMS,但我希望我的代码尽可能简单。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不应在ENUM上使用SUM。在内部,他们使用整数值。但你不应该用它来计算这些数字。 您可以group by enum列并在其他列上使用count()来获取每个枚举的投票数。

请参阅以下方案。

CREATE TABLE `votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` int(11) NOT NULL,
  `vote` enum('PARTY_2','PARTY_1','PARTY_9') DEFAULT NULL,
  PRIMARY KEY (`user`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

insert into votes( user, vote) values( 1, 2), (2, 3), (4,3), (3, 1), (6,1), (5,2), (8, 2), (9,3);

SELECT vote `Party`, count(id) as `Votes`  FROM votes group by `vote`;

输出

+---------+-------+
| Party   | Votes |
+---------+-------+
| PARTY_2 |     2 |
| PARTY_1 |     3 |
| PARTY_9 |     3 |
+---------+-------+

答案 1 :(得分:1)

我想如果你想在同一行上同时需要一个CASE语句。这样的应该工作

select sum(case when voteValue = 1 then 1 else 0 end) as positiveVoteTotal,
           sum(case when voteValue = -1 then 1 else 0 end) as negativeVoteTotal
from leTable

我认为你最好将投票表示为可以为空的位/布尔类型(你可以使用相同的技术来查询)