Got*_*bel 1 mysql sql unsigned integer
我有一个stats包含三列的表:
idup - 点赞数(就像在 StackOverflow 上一样)down - 类似于 upup并且down是INT(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属性?但这不是我应该使用该属性的合适情况吗?
无符号保持无符号,因此当结果为负时您会遇到问题。在减法之前转换为签名:
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)