powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связь многие- ко многим
12 сообщений из 12, страница 1 из 1
Связь многие- ко многим
    #33473101
OrcGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблицы:

tovar: tovar_id,tovar_name

prihod: tovar_id, cols

ishod: tovar_id, cols

каждая запись в таблицах prihod,ishod- приход (уход) товаров на склад (со склада)

Необходимо выбрать товар присутствующий на складе,
Присутствие товара на складе определяется на основе разницы прихода и ухода (если результат >0 то товар присутствует на складе)
По каждому товару может быть несколько приходов и уходов (и соответственно по несколько записей в соответствующих таблицах )

Реально ли это сделать одним запросом, без вложенных пожзапросов??
Может быть есть варианты с дополнительными связующими таблицами??
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33473129
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrcGodЕсть таблицы:

tovar: tovar_id,tovar_name

prihod: tovar_id, cols

ishod: tovar_id, cols

каждая запись в таблицах prihod,ishod- приход (уход) товаров на склад (со склада)

Необходимо выбрать товар присутствующий на складе,
Присутствие товара на складе определяется на основе разницы прихода и ухода (если результат >0 то товар присутствует на складе)
По каждому товару может быть несколько приходов и уходов (и соответственно по несколько записей в соответствующих таблицах )

Реально ли это сделать одним запросом, без вложенных пожзапросов??
Может быть есть варианты с дополнительными связующими таблицами??

Нужно свести приход и расход к однотаблизы движений, для расхода количество отризательное, при желани можно создать допалнительные присоединенные таблицы для раширенной информазии о приходе и расхе. Дальше выбераеш с простым SUM(количеество) и GROUP BY, но с течением времини эта кострукця начнет тормозить, без материализованых предстовлений(ониже индексированые) выход только в наружении нормализации данных. Тоесть создается таблиза остатак и каждый раз при модификазии таблизы движея модифицируется информация об остатке. Выход не саммый хороший особенно ели нет тригеров. Другого я незнаю, и помойму его нет.
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33473167
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажись так:
Код: plaintext
1.
2.
3.
4.
5.
SELECT t.tovar_id, t.tovar_name, SUM(p.cols-IFNULL(i.cols, 0 )) as b
FROM tovar t INNER JOIN prihod p ON t.tovar_id=p.tovar_id
LEFT JOIN ishod i ON t.tovar_id=i.tovar_id
GROUP BY  1 , 2 
HAVING b> 0 ;
до миллиона записей еще должно работать, но на десятке будет тормозить, лучше действительно завести колонку/таблицу остатков и триггерами ее обновлять

--
Dmitry
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33473781
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dinky
Код: plaintext
1.
2.
3.
4.
5.
SELECT t.tovar_id, t.tovar_name, SUM(p.cols-IFNULL(i.cols, 0 )) as b
FROM tovar t INNER JOIN prihod p ON t.tovar_id=p.tovar_id
LEFT JOIN ishod i ON t.tovar_id=i.tovar_id
GROUP BY  1 , 2 
HAVING b> 0 ;


OrcGod
По каждому товару может быть несколько приходов и уходов (и соответственно по несколько записей в соответствующих таблицах )


Не правильно, если есть один приход 10 шт. и три ухода по 1,получиш остаток 27
Правильно:

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT tovar_id, SUM(cols) AS ostatok
FROM prihod
UNION
SELECT tovar_id, SUM(-cols) AS ostatok
FROM rashod
GROUP BY tovar_id

И тормаза начнуться для MySQL намного раньше, особенно учитываея что этот запрос будет часто выполнятся как вложеный.
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33473913
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скобки пропустил. Правильно:

Код: plaintext
1.
2.
3.
4.
( SELECT tovar_id, SUM(cols) AS ostatok FROM prihod )
UNION
( SELECT tovar_id, SUM(-cols) AS ostatok FROM rashod )
GROUP BY tovar_id
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474018
OrcGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
u4x96Скобки пропустил. Правильно:

Код: plaintext
1.
2.
3.
4.
( SELECT tovar_id, SUM(cols) AS ostatok FROM prihod )
UNION
( SELECT tovar_id, SUM(-cols) AS ostatok FROM rashod )
GROUP BY tovar_id


не совсем понятная конструкция. (MySQL выдает ошибку)

может быть вот так:
Код: plaintext
1.
2.
3.
( SELECT tovar_id, SUM(cols) AS ostatok FROM prihod GROUP BY tovar_id )
UNION
( SELECT tovar_id, SUM(-cols) AS ostatok FROM rashod GROUP BY tovar_id )
но тогда необходимо использовать вложенные запросы.
а у меня mysql 4.0

((((
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474074
u4x96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда остается только свести приход, расход к одной таблицы.

Это же не веб приложение, ябы серьезно задумолся о зелесообразности применения MySQL темболее 4.0 версии.
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474079
OrcGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
u4x96Тогда остается только свести приход, расход к одной таблицы.

Это же не веб приложение, ябы серьезно задумолся о зелесообразности применения MySQL темболее 4.0 версии.

В том-то все и дело что web.
И хостинг виртуальный ... на Valuehoste.... поэтому и Mysql 4.0
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474116
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrcGodВ том-то все и дело что web.
ИМХО, на web стоит выкладывать только готовые данные, чтобы на самом сайте не выполнять никаких сложных запросов. Т.е. в данном случае я бы выложил таблицу с заранее посчтианными остатками. Кстати, помимо времени выполнения запроса, так еще и объем выгружемой информации сильно сократится.
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474342
OrcGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft OrcGodВ том-то все и дело что web.
ИМХО, на web стоит выкладывать только готовые данные, чтобы на самом сайте не выполнять никаких сложных запросов. Т.е. в данном случае я бы выложил таблицу с заранее посчтианными остатками. Кстати, помимо времени выполнения запроса, так еще и объем выгружемой информации сильно сократится.

Это небольшой web-склад.

количество наименований порядка 100-150 тыс
а постоянно на складе будут присутствовать лишь несколько десятков наименований. (поэтому и есть необходимость отображать тока товар в наличии)
Количество приходов-уходов товара за год порядка 100-200, что достаточно мало.. поэтому и хотелось бы сделать просчет в реальном времени

вообщем выход действительно к сведению таблиц движения товара в одну..
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33474410
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrcGodЭто небольшой web-склад.

количество наименований порядка 100-150 тыс
а постоянно на складе будут присутствовать лишь несколько десятков наименований. (поэтому и есть необходимость отображать тока товар в наличии)
Количество приходов-уходов товара за год порядка 100-200, что достаточно мало.. поэтому и хотелось бы сделать просчет в реальном времени

солидный склад! :)
уже больше 1000 лет работает! :)


вообщем выход действительно к сведению таблиц движения товара в одну..
поддерживаю!
проще каждый раз целиком заново переписывать несколько десятков записей, чем пытаться синхронизировать изменения 100-150 тыс. записей
...
Рейтинг: 0 / 0
Связь многие- ко многим
    #33475052
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UNION в 4.0 есть, только сортировку добавить надо:
Код: plaintext
1.
2.
3.
( SELECT tovar_id, SUM(cols) AS ostatok FROM prihod GROUP BY tovar_id )
UNION
( SELECT tovar_id, SUM(-cols) AS ostatok FROM ishod GROUP BY tovar_id )
ORDER BY  1 
и скриптом уже в цикле считать разницу.. но тогда уже проще отдельными селектами дергать - сначала один селект на товар с приходом, а потом по запросу на каждый по расходу - это будет быстрее одного сложного запроса с подзапросами, MySQL сможет их по несколько штук в секунду переваривать без проблем (в отличие от "нормальных серверов" :-> ) Еще кэш запросов должен помочь ;)

--
Dmitry
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связь многие- ко многим
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]