MySql Table 其中每一行都有多个外键指向一个 table
MySql Table where every row has multiple foreign key to one table
我现在的情况:
表 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;
鉴于我有这两个 table,其中 PackingList table 的每一行都包含多个引用 PartId table 中一行的 ID,我想得到类似 PackingList 的列表,其中每一行都是一个关系 PackingList(可以重复)--> partId :
PackingListId PartId
H0001 partId1
H0001 . partId2
等等。
到目前为止,我做了一些 select 来收集这些信息,但我没有得到那么多,有人可以帮我写一个带有这样结果的查询吗?
像这样使用子查询
SELECT T1_Id,(SELECT T2_Id FROM Table2) as T2_Id, (SELECT C1 FROM Table2) as C1, (SELECT C2 FROM TAble2) 作为 C2,(SELECT C3 FROM TAble2) 作为 C3 FROM Table1
专业提示 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 table 是 非规范化的 。在您的应用程序中更改它可能为时已晚,但无论如何您都应该阅读它。
我现在的情况:
表 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;
鉴于我有这两个 table,其中 PackingList table 的每一行都包含多个引用 PartId table 中一行的 ID,我想得到类似 PackingList 的列表,其中每一行都是一个关系 PackingList(可以重复)--> partId :
PackingListId PartId
H0001 partId1
H0001 . partId2
等等。
到目前为止,我做了一些 select 来收集这些信息,但我没有得到那么多,有人可以帮我写一个带有这样结果的查询吗?
像这样使用子查询
SELECT T1_Id,(SELECT T2_Id FROM Table2) as T2_Id, (SELECT C1 FROM Table2) as C1, (SELECT C2 FROM TAble2) 作为 C2,(SELECT C3 FROM TAble2) 作为 C3 FROM Table1
专业提示 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 table 是 非规范化的 。在您的应用程序中更改它可能为时已晚,但无论如何您都应该阅读它。