Здравствуйте. Про функцию IF() знаю. Запрос из базы mysql , такой: Код (Text): SELECT storage, balance - reserve as balance FROM products_balance WHERE product_id= 1351 and (balance - reserve)=(SELECT max(balance - reserve) FROM products_balance WHERE product_id= 1351) LIMIT 1 Иногда значение поля reserve больше , чем значение поля balance . Поэтому возникает ошибка: Код (Text): Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range Про функцию IF() знаю. Но вроде в данном случае IF применим только в блоке SELECT, где WHERE его применить не получается. SELECT storage, IF(balance > reserve, balance - reserve, 0) as balance А как сделать для остальной части запроса?
зачем "as balance" (называть как существующее поле)? не уверен, что проблема в этом, но может и в этом.
переписал запрос , на одно вычитание. а главное если значение поля reserve окажется больше поля balance , то exception не возникнет Результаты те же отдает, что и исходный запрос. Сомневался , что из IF внутри MAX корректно сработает, но вроде нормально. Код (Text): SELECT t1.`storage`, t1.`max_exists_balance` as `balance` FROM ( SELECT `storage`, MAX(IF(`balance` > `reserve`, `balance`-`reserve`, 0)) as `max_exists_balance` FROM `products_balance` WHERE `product_id`= 100265977 GROUP BY `storage` ) as t1 ORDER BY t1.`max_exists_balance` DESC LIMIT 1
Добрый день! Избежать можно использую версию MySql поновее. см. здесь https://dba.stackexchange.com/questions/212838/bigint-unsigned-value-is-out-of-range Проверил на MySql 5.7 Win-10 Код (Text): SELECT balance - reserve as balance FROM `test2`; balance 100 reserve 200 //результат balance -100 Удачи!
По ссылке выше также показаны два хорошо известных способа обхода ошибки: 1) CAST(field AS SIGNED) (к каждому из двух полей, если они оба UNSIGNED); 2) SET SQL_MODE = "NO_UNSIGNED_SUBTRACTION";