За последние 24 часа нас посетили 71300 программистов и 10274 робота. Сейчас ищут 2712 программистов ...

как избежать ошибки при вычитании , если значение одного поля больше другого?

Тема в разделе "MySQL", создана пользователем yanuzay, 28 июл 2024.

  1. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    Здравствуйте.

    Про функцию IF() знаю.

    Запрос из базы mysql , такой:

    Код (Text):
    1. 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):
    1.  
    2. 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

    А как сделать для остальной части запроса?
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    зачем "as balance" (называть как существующее поле)? не уверен, что проблема в этом, но может и в этом.
     
  3. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    переписал запрос , на одно вычитание. а главное если значение поля reserve окажется больше поля balance , то exception не возникнет

    Результаты те же отдает, что и исходный запрос.
    Сомневался , что из IF внутри MAX корректно сработает, но вроде нормально.

    Код (Text):
    1. SELECT t1.`storage`, t1.`max_exists_balance` as `balance`
    2. FROM (
    3.     SELECT `storage`, MAX(IF(`balance` > `reserve`, `balance`-`reserve`, 0)) as `max_exists_balance`
    4.     FROM `products_balance`
    5.     WHERE `product_id`= 100265977
    6.     GROUP BY `storage`
    7. ) as t1
    8. ORDER BY t1.`max_exists_balance` DESC
    9. LIMIT 1
     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    97
    Адрес:
    Бавария, Германия
    Добрый день!
    Избежать
    можно использую версию MySql поновее.
    см. здесь https://dba.stackexchange.com/questions/212838/bigint-unsigned-value-is-out-of-range

    Проверил на MySql 5.7 Win-10
    Код (Text):
    1. SELECT balance - reserve as balance FROM `test2`;
    2. balance 100
    3. reserve 200
    4.  
    5. //результат
    6. balance
    7. -100
    Удачи!
     
    yanuzay нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
    По ссылке выше также показаны два хорошо известных способа обхода ошибки:
    1) CAST(field AS SIGNED) (к каждому из двух полей, если они оба UNSIGNED);
    2) SET SQL_MODE = "NO_UNSIGNED_SUBTRACTION";
     
    yanuzay нравится это.