У меня есть запасы в разных местах и вы хотите иметь отдельный список инвентаря для каждого местоположения. Кадастры должны содержать один и тот же материал в каждом месте, поэтому я хочу использовать "главный список", в котором хранятся имя и стандартное количество каждого элемента. Тогда каждое место должно иметь фактическое количество для каждого элемента.
Я могу скопировать весь список для каждого местоположения, но вместо этого хочу обновить основной список. Я попытался найти в Интернете решение, но я не могу найти то, что ищу, или я не знаю, что искать. Любые идеи, как я могу это решить?
Спасибо
Вам нужно что-то вроде этого (упрощенная версия, содержащая только обязательные поля):
Структура базы данных:
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
У вас есть общий список элементов в табличных items
где вы можете ввести стандартное количество, которое потребуется для всех местоположений. И если вам нужно его обновить, сделайте это в одной таблице, и оно будет применяться ко всем местоположениям одновременно.
Вставить/обновить фактическое местоположение в таблице locations_items
которая является уникальной для каждого местоположения и элемента. Там вы можете записывать фактические количества для каждого места.
И запрос позволяет вам получать все требуемые/фактические количества во всех местах. Вы можете, конечно, уточнить его с дополнительными условиями, чтобы получить определенное местоположение (а) или предмет (ы).