7

我有三个通过左连接连接的表。这是代码:

SELECT
(LEAST(`a`.`price, `b`.`price`) - `c`.`price`) AS `diff`
...
ORDER BY `diff` DESC

问题:cprice大于 LEAST,因此减法为负并抛出 BIGINT UNSIGNED value is out of range。我怎样才能让它不抛出这个荒谬的错误?
这是结果数据,我没有修改表中的实际数据,为什么它不允许我正常执行此操作?我已经尝试CAST(LEAST(...) AS SIGNED)在 LEAST 中将两列都按签名进行转换,但都没有奏效。

4

2 回答 2

7

在 LEAST 之前和减法之前将每个数字转换为 SIGNED

SELECT
(LEAST(CAST(`a`.`price` AS SIGNED), CAST(`b`.`price` AS SIGNED)) - CAST(`c`.`price` AS SIGNED)) AS `diff`
...
ORDER BY `diff` DESC
于 2012-11-08T11:49:23.317 回答
1

您可能需要检查NO_UNSIGNED_SUBTRACTION运算符:http ://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_no_unsigned_subtraction 。

但是,使用它存在风险:http: //datacharmer.blogspot.fi/2006/11/hidden-risks-of-sql-mode.html

于 2012-11-08T11:48:14.523 回答