我想将“voteValue”列中的值限制为-1或1,因此我使用了ENUM数据类型。但是,当我尝试计算投票的总价值(即+1票和-1票)时,我最终得到的每个-1票数为+2而不是减法。
我知道我可以把它分成两个不同的SQL代码来分别获得+1和-1票的SUMS,但我希望我的代码尽可能简单。
有什么想法吗?
答案 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
我认为你最好将投票表示为可以为空的位/布尔类型(你可以使用相同的技术来查询)