根据 mysql 中的主列表制作清单
Making inventory lists from a master list in mysql
我在不同地点有库存,希望每个地点都有单独的库存清单。库存应该在每个位置包含相同的东西,所以我想使用 "master list" 来存储每个项目的名称和标准数量。然后每个位置应该有每个项目的实际数量。
我可以复制每个位置的整个列表,但我希望能够更新主列表。我曾尝试在网上搜索解决方案,但找不到我要找的东西,或者我不知道要搜索什么。我有什么办法可以解决这个问题吗?
谢谢
您需要这样的东西(仅包含必填字段的简化版本):
数据库结构:
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
您在 table items
中有常用项目列表,您可以在其中输入所有地点都需要的标准数量。如果您需要更新它,请在同一个 table 中进行,它将立即应用于所有位置。
Insert/update table locations_items
中的实际位置,每个位置和项目都是唯一的。在那里您可以记录每个位置的实际数量。
并且查询允许您获取所有位置的所有项目 required/actual 数量。您当然可以使用其他条件对其进行微调以获得特定位置或项目。
我在不同地点有库存,希望每个地点都有单独的库存清单。库存应该在每个位置包含相同的东西,所以我想使用 "master list" 来存储每个项目的名称和标准数量。然后每个位置应该有每个项目的实际数量。
我可以复制每个位置的整个列表,但我希望能够更新主列表。我曾尝试在网上搜索解决方案,但找不到我要找的东西,或者我不知道要搜索什么。我有什么办法可以解决这个问题吗?
谢谢
您需要这样的东西(仅包含必填字段的简化版本):
数据库结构:
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
您在 table items
中有常用项目列表,您可以在其中输入所有地点都需要的标准数量。如果您需要更新它,请在同一个 table 中进行,它将立即应用于所有位置。
Insert/update table locations_items
中的实际位置,每个位置和项目都是唯一的。在那里您可以记录每个位置的实际数量。
并且查询允许您获取所有位置的所有项目 required/actual 数量。您当然可以使用其他条件对其进行微调以获得特定位置或项目。