在mysql中从主列表生成库存列表

sf6xfgos  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(334)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

两年前关门了。
改进这个问题
我有不同地点的库存,希望能够有一个单独的库存清单为每个位置。库存应该包含在每个位置相同的东西,所以我想使用一个“主列表”,存储每个项目的名称和标准数量。那么每个位置都应该有每个项目的实际数量。
我可以复制每个位置的整个列表,但我希望能够更新主列表。我试着在网上搜索解决方案,但我找不到我要找的,或者我不知道要搜索什么。有什么办法解决这个问题吗?
谢谢

a0zr77ik

a0zr77ik1#

您需要这样的内容(仅包含必需字段的简化版本):
数据库结构:

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 每个位置和项目都是唯一的。在那里你可以记录每个地点的实际数量。
和查询允许您获取所有位置的所有所需项目/实际数量。当然,您可以使用附加条件对其进行微调,以获得特定的位置或项目。

相关问题