За последние 24 часа нас посетили 20059 программистов и 1695 роботов. Сейчас ищут 1899 программистов ...

SUM() умножает значение на 2

Тема в разделе "MySQL", создана пользователем officeoff.ru, 19 сен 2017.

  1. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Всем привет!
    Написал запрос:
    Код (Text):
    1. SELECT `product`.`id`, `product`.`name`, `product`.`price`, `product`.`article`,
    2. SUM(`skladnal`.`nal`), SUM(`reserv`.`kol`)
    3. FROM `product`
    4. left join `skladnal` on `skladnal`.`id_product`=`product`.`id`
    5. left join `reserv` on `reserv`.`id_product`=`product`.`id`
    6. WHERE `product`.`id_global` = '553'
    И происходит странная вещь - SUM(`skladnal`.`nal`) - показывает нужный результат
    А SUM(`reserv`.`kol`) - умножает полученное значение на 2

    Собственно, вопрос как убрать это умножение и почему оно происходит?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    раз так считает, значит таковы данные в твоём запросе. убери sum, посчитай на пальцах, подумай

    updated: "убери sum" значит вместо sum(hujnane) напиши просто hujnane — тебе надо увидеть данные.
     
    #2 artoodetoo, 19 сен 2017
    Последнее редактирование: 19 сен 2017
  3. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Так в том и проблема, что в базе всего 1 строка. И она умножается
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    я твои данные не вижу (и видеть не хочу ;) ) но могу сказать, что когда ты джойнишь две или более таблиц, ты можешь получить бОльшее количество строк, чем было бы с одной таблицей.
    — Ваш Капитан Очевидность

    sum() суммирует все доступные ему строки, а не уникальные по какому-то признаку. и если другой sum() НЕ "удвоил", это значит что конкретно та другая колонка в каждом втором случае пустая — т.к. left join этому способствует.
    --- Добавлено ---
    нет, дружок. проблема в тебе — ты пришёл за советом и получил его. но фиг забил. я тебе говорю: убери sum, чтобы увидеть что именно он суммирует. замени на просто колонку без функции. увидишь, что там не одна строка
     
    #4 artoodetoo, 19 сен 2017
    Последнее редактирование: 19 сен 2017
  5. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Да я сразу попробовал убрать sum(), И вижу что строка 1, я бы не стал писать про это выше.
    --- Добавлено ---
    А в случае если строк несколько, то нужно использовать Group by? Тогда будет корректное суммирование?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Так одна или в случае?
    --- Добавлено ---
    Истинно говорю вам: когда в исходной выборке одна строка, SUM от колонки будет равен значению из той одной строки. Единственная разница — null превращается в 0.
    --- Добавлено ---
    Ещё раз и совсем подробно: чтобы увидеть какие строки суммируются, замени ВСЕ (совсем все) sum() на имена полей, которые хочешь суммировать. Без GROUP BY пока что. Если что-то здесь непонятно — спроси.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А еще желательно запросы писать не вслепую, а в IDE типа того же phpStorm. От простого к сложному, итеративно добавляя новые условия, тестируя разные фрагменты независимо. Вот честно - одно удовольствие так работать. Особенно, если надо сделать что-то хитровыбоенное прям.
    Есть мнение, что в вашем случае можно inner join просто юзать.
     
  8. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Да, я понял, что нужно убрать все sum(), и добавил строк в таблицу побольше. Теперь действительно строки дублируются. И соотвественно ясно почему получается результат больше.

    Чтобы исключить дубли попробовал group by и distinct, но они положительного результата не дали. Погуглил, увидел что нужно использовать подзапросы в join. Пока не пробовал, но имхо это не самое классное решение, наверняка есть способ проще. А более простой способ всегда интереснее.
    --- Добавлено ---
    Да у меня вроде простая задача)))
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    ну слава тебе хосподя!

    видимо SQL запрос надо как-то иначе написать. попробуй изложить саму суть задачи. а лучше всего, создай песочницу на sqlfiddle.com с достаточным количеством данных для демонстрации — мы тебе подкинем годных запросов.
     
  10. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Ну тупанул, признаю!

    http://sqlfiddle.com/#!9/07d938/1
     
    artoodetoo нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Отлично! А что мы хотим посчитать?
    Для начала чуть изменённый запрос чтобы показать причину "удвоения":
    http://sqlfiddle.com/#!9/07d938/3
    минус sum, плюс вывод айдишников связанных таблиц. как видишь, одной записи из product соответствует две разные записи в reserv, что бы это ни значило. один ко многим. я не уверен что значят эти таблицы, подсказывай суть задачи.
     
  12. officeoff.ru

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

    С нами с:
    31 янв 2015
    Сообщения:
    16
    Симпатии:
    1
    Нам нужно в запросе получить сумму резерва по товару и его наличию.
    То есть сумму `reserv`.`kol` и `skladnal`.`nal`