我有一个包含三列的表stats
:
id
up
- upvotes的数量(就像在StackOverflow这样)down
- 类似于up
up
和down
为INT(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
属性?但这不是我应该使用该属性的适当情况吗?
答案 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;