无法从另一个值中减去一个值(无符号)

时间:2014-07-10 18:26:24

标签: mysql sql integer unsigned

我有一个包含三列的表stats

  • id
  • up - upvotes的数量(就像在StackOverflow这样)
  • down - 类似于up

updownINT(11)UNSIGNED(因为它们只是正值)。

现在,当我想要获取具有最高(up-down)值的十个项目时,我正在使用此查询:

SELECT id, up, down, (up-down) AS result
FROM stats
ORDER BY result DESC
LIMIT 0,10

但我收到了错误

#1690 - BIGINT UNSIGNED value is out of range in
        '(`database`.`stats`.`up` - `database`.`stats`.`down`)'

如果我遗漏ORDER BY result DESC一切顺利进行(除了result没有订购它们,但up-down的数学运算正常)。

为了检索正确的结果,我需要在查询中更改哪些内容?或者我是否必须删除UNSIGNED属性?但这不是我应该使用该属性的适当情况吗?

1 个答案:

答案 0 :(得分:3)

无符号保持未签名,因此当结果为负时您遇到问题。在减法之前转换为签名:

SELECT id, up, down, cast(up as signed) - cast(down as signed) AS result
FROM stats
ORDER BY result DESC
LIMIT 0, 10;

或者,保留您的查询并添加where子句:

SELECT id, up, down, (up-down) AS result
FROM stats
WHERE up >= down
ORDER BY result DESC
LIMIT 0,10;