Всем привет! Написал запрос: Код (Text): SELECT `product`.`id`, `product`.`name`, `product`.`price`, `product`.`article`, SUM(`skladnal`.`nal`), SUM(`reserv`.`kol`) FROM `product` left join `skladnal` on `skladnal`.`id_product`=`product`.`id` left join `reserv` on `reserv`.`id_product`=`product`.`id` WHERE `product`.`id_global` = '553' И происходит странная вещь - SUM(`skladnal`.`nal`) - показывает нужный результат А SUM(`reserv`.`kol`) - умножает полученное значение на 2 Собственно, вопрос как убрать это умножение и почему оно происходит?
раз так считает, значит таковы данные в твоём запросе. убери sum, посчитай на пальцах, подумай updated: "убери sum" значит вместо sum(hujnane) напиши просто hujnane — тебе надо увидеть данные.
я твои данные не вижу (и видеть не хочу ) но могу сказать, что когда ты джойнишь две или более таблиц, ты можешь получить бОльшее количество строк, чем было бы с одной таблицей. — Ваш Капитан Очевидность sum() суммирует все доступные ему строки, а не уникальные по какому-то признаку. и если другой sum() НЕ "удвоил", это значит что конкретно та другая колонка в каждом втором случае пустая — т.к. left join этому способствует. --- Добавлено --- нет, дружок. проблема в тебе — ты пришёл за советом и получил его. но фиг забил. я тебе говорю: убери sum, чтобы увидеть что именно он суммирует. замени на просто колонку без функции. увидишь, что там не одна строка
Да я сразу попробовал убрать sum(), И вижу что строка 1, я бы не стал писать про это выше. --- Добавлено --- А в случае если строк несколько, то нужно использовать Group by? Тогда будет корректное суммирование?
Так одна или в случае? --- Добавлено --- Истинно говорю вам: когда в исходной выборке одна строка, SUM от колонки будет равен значению из той одной строки. Единственная разница — null превращается в 0. --- Добавлено --- Ещё раз и совсем подробно: чтобы увидеть какие строки суммируются, замени ВСЕ (совсем все) sum() на имена полей, которые хочешь суммировать. Без GROUP BY пока что. Если что-то здесь непонятно — спроси.
А еще желательно запросы писать не вслепую, а в IDE типа того же phpStorm. От простого к сложному, итеративно добавляя новые условия, тестируя разные фрагменты независимо. Вот честно - одно удовольствие так работать. Особенно, если надо сделать что-то хитровыбоенное прям. Есть мнение, что в вашем случае можно inner join просто юзать.
Да, я понял, что нужно убрать все sum(), и добавил строк в таблицу побольше. Теперь действительно строки дублируются. И соотвественно ясно почему получается результат больше. Чтобы исключить дубли попробовал group by и distinct, но они положительного результата не дали. Погуглил, увидел что нужно использовать подзапросы в join. Пока не пробовал, но имхо это не самое классное решение, наверняка есть способ проще. А более простой способ всегда интереснее. --- Добавлено --- Да у меня вроде простая задача)))
ну слава тебе хосподя! видимо SQL запрос надо как-то иначе написать. попробуй изложить саму суть задачи. а лучше всего, создай песочницу на sqlfiddle.com с достаточным количеством данных для демонстрации — мы тебе подкинем годных запросов.
Отлично! А что мы хотим посчитать? Для начала чуть изменённый запрос чтобы показать причину "удвоения": http://sqlfiddle.com/#!9/07d938/3 минус sum, плюс вывод айдишников связанных таблиц. как видишь, одной записи из product соответствует две разные записи в reserv, что бы это ни значило. один ко многим. я не уверен что значят эти таблицы, подсказывай суть задачи.
Нам нужно в запросе получить сумму резерва по товару и его наличию. То есть сумму `reserv`.`kol` и `skladnal`.`nal`