SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.10.2007 10:00:08

belenkov
Участник
Зарегистрирован: 22.10.2007
Сообщений: 5

Помогите плиз с запросом

Бодрого времени суток!

Есть 3 таблицы
tovar - справочник товаров
tovarprih - поступления
zakazmaterial - отпуск

Необходимо выбрать список товара из справочника с остатками приход-расход. При этом товар может быть отпущен, но не поступил.

Делаю:

select tovar.name, sum(tovarprih.kol), sum(zakazmaterial.kol) from tovar, tovarprih, zakazmaterial where tovarprih.tovarid=tovar.id and zakazmaterial.idname=tovar.id GROUP BY tovar.name

Что не так.

Неактивен

 

#2 23.10.2007 03:00:23

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Помогите плиз с запросом

Опишите, в чем конкретно состоит проблема.

Неактивен

 

#3 23.10.2007 07:30:49

belenkov
Участник
Зарегистрирован: 22.10.2007
Сообщений: 5

Re: Помогите плиз с запросом

Проблема состоит в следующем:

выборка select tovar.name, sum(tovarprih.kol) from tovar, tovarprih group by tovar.name

дает результат корректный, какой товар поступил. Аналогично дает выборка по расходу.

А если выбираем и то и то, появляются казусы.

Товар есть в таблице tovarprih но нет в zakazmaterial - в выборку не попадает
Товар есть в таблице zakazmaterial но нет tovarprih в - в выборку не попадает

Поэтому суммировать приход - расход не получается

Неактивен

 

#4 23.10.2007 10:37:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите плиз с запросом

Если Вы хотите объединить две выборки, то можно использовать UNION
(SELECT name FROM tovarprih) UNION (SELECT name FROM zakazmaterial)

Неактивен

 

#5 29.10.2007 09:18:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите плиз с запросом

belenkov написал:

Проблема состоит в следующем:

выборка select tovar.name, sum(tovarprih.kol) from tovar, tovarprih group by tovar.name

дает результат корректный, какой товар поступил. Аналогично дает выборка по расходу.

А если выбираем и то и то, появляются казусы.

Товар есть в таблице tovarprih но нет в zakazmaterial - в выборку не попадает
Товар есть в таблице zakazmaterial но нет tovarprih в - в выборку не попадает

Поэтому суммировать приход - расход не получается

Так и должно быть. Вы перечесляете таблицы через запятую (аналог врутреннего объединения - INNER JOIN), т.е. выбираете только записи имеющие соответствие. А хотите получить записи в том числе и не имеющие соответствия, для этого Вам нужно использовать внешнее объединение, например LEFT JOIN.

Например Ваш запрос может выглядеть следующим образом:

SELECT Tovar.Name SUM(Tovarprih.Kol), SUM(Zakazmaterial.Kol) FROM Tovar LEFT JOIN Tovarprih ON Tovarprih.Tovarid=Tovar.Id LEFT JOIN Zakazmaterial ON Zakazmaterial.Idname=Tovar.Id GROUP BY Tovar.Name

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson