Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связь многие- ко многим / 12 сообщений из 12, страница 1 из 1
09.01.2006, 23:30:54
    #33473101
OrcGod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие- ко многим
Есть таблицы:

tovar: tovar_id,tovar_name

prihod: tovar_id, cols

ishod: tovar_id, cols

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

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

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

tovar: tovar_id,tovar_name

prihod: tovar_id, cols

ishod: tovar_id, cols

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

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

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

Нужно свести приход и расход к однотаблизы движений, для расхода количество отризательное, при желани можно создать допалнительные присоединенные таблицы для раширенной информазии о приходе и расхе. Дальше выбераеш с простым SUM(количеество) и GROUP BY, но с течением времини эта кострукця начнет тормозить, без материализованых предстовлений(ониже индексированые) выход только в наружении нормализации данных. Тоесть создается таблиза остатак и каждый раз при модификазии таблизы движея модифицируется информация об остатке. Выход не саммый хороший особенно ели нет тригеров. Другого я незнаю, и помойму его нет.
...
Рейтинг: 0 / 0
10.01.2006, 01:15:15
    #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
10.01.2006, 12:01:08
    #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
10.01.2006, 12:36:16
    #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
10.01.2006, 13:05:13
    #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
10.01.2006, 13:26:30
    #33474074
u4x96
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие- ко многим
Тогда остается только свести приход, расход к одной таблицы.

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

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

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

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

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

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

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

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


вообщем выход действительно к сведению таблиц движения товара в одну..
поддерживаю!
проще каждый раз целиком заново переписывать несколько десятков записей, чем пытаться синхронизировать изменения 100-150 тыс. записей
...
Рейтинг: 0 / 0
10.01.2006, 19:05:27
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связь многие- ко многим / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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