mysql表,其中每一行对一个表有多个外键

kokeuurv  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(428)

我有目前的情况:
表1 Package 清单:

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表的每一行都包含引用partid表中一行的多个id,我想得到一个类似packinglist的列表,其中每一行都是关系packinglist(可以重复)-->partid:

PackingListId PartId
H0001          partId1
H0001 .        partId2

等等。
到目前为止,我做了一些选择,以获得这些信息,但我没有得到那么远,有人能帮我写一个这样的结果查询?

xnifntxz

xnifntxz1#

使用子查询like
选择t1\ id,(从表2中选择t2\ id)作为t2\ id,(从表2中选择c1)作为c1,(从表2中选择c2)作为c2,(从表2中选择c3)作为表1中的c3

w8biq8rn

w8biq8rn2#

专业技巧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

pro技巧2:这比需要的困难,因为t1表是非规范化的。现在在你的申请表中更改它可能已经太迟了,但是无论如何你都应该阅读它。

相关问题