Создание списков инвентаря из основного списка в MySQL

0

У меня есть запасы в разных местах и вы хотите иметь отдельный список инвентаря для каждого местоположения. Кадастры должны содержать один и тот же материал в каждом месте, поэтому я хочу использовать "главный список", в котором хранятся имя и стандартное количество каждого элемента. Тогда каждое место должно иметь фактическое количество для каждого элемента.

Я могу скопировать весь список для каждого местоположения, но вместо этого хочу обновить основной список. Я попытался найти в Интернете решение, но я не могу найти то, что ищу, или я не знаю, что искать. Любые идеи, как я могу это решить?

Спасибо

  • 0
    Пожалуйста, опубликуйте, по крайней мере, схему вашей базы данных. Посмотрите на Как спросить
Теги:
inventory

1 ответ

0
Лучший ответ

Вам нужно что-то вроде этого (упрощенная версия, содержащая только обязательные поля):

Структура базы данных:

CREATE TABLE IF NOT EXISTS 'items' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'item_name' varchar(50) NOT NULL,
  'required_quantity' int(11) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO 'items' ('id', 'item_name', 'required_quantity') VALUES
(1, 'Item 1', 10),
(2, 'Item 2', 20);

-- --------------------------------------------------------


CREATE TABLE IF NOT EXISTS 'locations' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'location_name' varchar(50) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Zrzut danych tabeli 'locations'
--

INSERT INTO 'locations' ('id', 'location_name') VALUES
(1, 'Location 1'),
(2, 'Location 2');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS 'locations_items' (
  'location_id' int(11) NOT NULL,
  'item_id' int(11) NOT NULL,
  'actual_quantity' int(11) NOT NULL,
  UNIQUE KEY 'location_id' ('location_id','item_id'),
  KEY 'item_id' ('item_id')
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO 'locations_items' ('location_id', 'item_id', 'actual_quantity') VALUES
(1, 1, 5),
(2, 2, 7);


ALTER TABLE 'locations_items'
  ADD CONSTRAINT 'locations_items_ibfk_1' FOREIGN KEY ('location_id') REFERENCES 'locations' ('id') ON UPDATE CASCADE,
  ADD CONSTRAINT 'locations_items_ibfk_2' FOREIGN KEY ('item_id') REFERENCES 'items' ('id') ON UPDATE CASCADE;

Запрос, чтобы получить каждое место и каждый элемент с необходимым (базовым количеством) и фактическим количеством для каждого места:

SELECT 

q.location_id,
q.location_name,
q.item_id,
q.item_name,
q.required_quantity,
IFNULL(li.actual_quantity, 0) AS actual_quantity

FROM
(SELECT
    l.id AS location_id,
    l.location_name,
    i.id AS item_id,
    i.item_name,
    i.required_quantity
FROM
    locations AS l
CROSS JOIN items AS i
) AS q

LEFT JOIN locations_items AS li ON q.location_id = li.location_id AND q.item_id = li.item_id

Демо-версия SQL Fiddle

У вас есть общий список элементов в табличных items где вы можете ввести стандартное количество, которое потребуется для всех местоположений. И если вам нужно его обновить, сделайте это в одной таблице, и оно будет применяться ко всем местоположениям одновременно.

Вставить/обновить фактическое местоположение в таблице locations_items которая является уникальной для каждого местоположения и элемента. Там вы можете записывать фактические количества для каждого места.

И запрос позволяет вам получать все требуемые/фактические количества во всех местах. Вы можете, конечно, уточнить его с дополнительными условиями, чтобы получить определенное местоположение (а) или предмет (ы).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню