MySql表,其中每一行都有一个表的多个外键

时间:2018-07-25 15:03:41

标签: mysql join foreign-keys create-table denormalization

我目前的状况:

表1装箱单:

CREATE TABLE `PackingList` (
  `PackingListId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Sku` char(10) NOT NULL DEFAULT '',
  `PartId1` int(8) unsigned NOT NULL,
  `PartId2` int(8) unsigned DEFAULT NULL,
  `PartId3` int(8) unsigned DEFAULT NULL,
  `PartId4` int(8) unsigned DEFAULT NULL,
  `PartId5` int(8) unsigned DEFAULT NULL,
  `PartId6` int(8) unsigned DEFAULT NULL,
  `PartId7` int(8) unsigned DEFAULT NULL,
  `PartId8` int(8) unsigned DEFAULT NULL,
  `PartId9` int(8) unsigned DEFAULT NULL,
  `PartId10` int(8) unsigned DEFAULT NULL,
  PRIMARY KEY (`PackingListId`),
  KEY `PartId1 <-> PLC_PartId[PartId]` (`PartId1`),
  KEY `PartId2 <-> PLC_PartId[PartId]` (`PartId2`),
  KEY `PartId3 <-> PLC_PartId[PartId]` (`PartId3`),
  KEY `PartId4 <-> PLC_PartId[PartId]` (`PartId4`),
  KEY `PartId5 <-> PLC_PartId[PartId]` (`PartId5`),
  KEY `PartId6 <-> PLC_PartId[PartId]` (`PartId6`),
  KEY `PartId7 <-> PLC_PartId[PartId]` (`PartId7`),
  KEY `PartId8 <-> PLC_PartId[PartId]` (`PartId8`),
  KEY `PartId9 <-> PLC_PartId[PartId]` (`PartId9`),
  KEY `PartId10 <-> PLC_PartId[PartId]` (`PartId10`),
);

表2(PartId):

 CREATE TABLE `PartId` (
  `PartSkuId` int(8) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `Content` varchar(255) DEFAULT NULL,
  `Height` decimal(7,2) unsigned NOT NULL,
  `Width` decimal(7,2) unsigned NOT NULL,
  `Depth` decimal(7,2) unsigned NOT NULL,
  `Weight` decimal(7,3) unsigned NOT NULL,
  `Supplier` varchar(100) NOT NULL DEFAULT '',
  `Created` datetime DEFAULT NULL,
  `CreatedBy` varchar(20) DEFAULT NULL,
  `InUse` tinyint(1) DEFAULT '1',
  `FF_Confirmed` datetime DEFAULT NULL,
  PRIMARY KEY (`PartSkuId`),
  KEY `Supplier` (`Supplier`)
) ENGINE=InnoDB AUTO_INCREMENT=6698 DEFAULT CHARSET=utf8;

考虑到我有两个表,其中PackingList表的每一行都包含多个ID,这些ID引用PartId表中的一行,我想得到类似PackingList的列表,其中每一行都是一个关系PackingList (可以重复)-> partId:

PackingListId PartId
H0001          partId1
H0001 .        partId2

以此类推。

到目前为止,我做了一些选择来将这些信息汇总在一起,但是我没有做到那么远,有人可以帮我写出这样的结果吗?

2 个答案:

答案 0 :(得分:0)

使用类似的子查询

SELECT T1_Id,(SELECT T2_Id FROM Table2)作为T2_Id,(SELECT C1 FROM Table2)作为C1,(SELECT C2 FROM TAble2)作为C2,(SELECT C3 FROM TAble2)作为C3 FROM Table1

答案 1 :(得分:0)

专业提示1 :弄清楚SQL查询(或实际上任何程序)必须做什么的时间越长,花费的时间就越少。

这是猜测。在您编辑问题之前,我正在回答您的问题。但是我相信你想要这样的东西

这将使您获得t1.p1中提到的t2中的值。

      SELECT t1.T1_Id, t2.T2_Id, t2.c1, t2.c2, t2.c3
        FROM T1
        LEFT JOIN T2 ON T1.p1 = T2_Id

然后,您需要弄乱这些子查询,每个p*项目一个。您将合并这些子查询。

SELECT  T1_Id, T2_Id, c1, c2, c3
  FROM
      SELECT t1.T1_Id, t2.T2_Id, t2.c1, t2.c2, t2.c3
        FROM T1
        LEFT JOIN T2 ON T1.p1 = T2_Id
 UNION
      SELECT t1.T1_Id, t2.T2_Id, t2.c1, t2.c2, t2.c3
        FROM T1
        LEFT JOIN T2 ON T1.p2 = T2_Id
 UNION
      SELECT t1.T1_Id, t2.T2_Id, t2.c1, t2.c2, t2.c3
        FROM T1
        LEFT JOIN T2 ON T1.p3 = T2_Id
ORDER BY T1_Id, T2_Id

专业提示2 :这比您所需的难度更大,因为您的t1表已被非规范化。在您的应用程序中进行更改可能为时已晚,但是无论如何您都应该阅读它。