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

Got*_*bel 1 mysql sql unsigned integer

我有一个stats包含三列的表:

  • id
  • up - 点赞数(就像在 StackOverflow 上一样)
  • down - 类似于 up

up并且downINT(11)UNSIGNED(因为它们只会是正值)。

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

SELECT id, up, down, (up-down) AS result
FROM stats
ORDER BY result DESC
LIMIT 0,10
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误

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

如果我不考虑,ORDER BY result DESC一切都会顺利运行(除了它们不是由 订购的result,但数学运算up-down正在运行)。

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

Gor*_*off 5

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

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

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

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