MySql表,其中每行有多个外键指向一个表

MySql表,其中每行有多个外键指向一个表,mysql,join,foreign-keys,create-table,denormalization,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) uns

我对目前的情况有所了解:

表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`),
);
考虑到我有这两个表,其中PackingList表的每一行都包含引用PartId表中一行的多个id,我想得到类似PackingList的列表,其中每一行都是一个关系PackingList可以重复->PartId:

PackingListId PartId
H0001          partId1
H0001 .        partId2
等等

到目前为止,我做了一些选择来收集这些信息,但我没有做到这一点,有人能帮我写一个这样的查询结果吗

使用子查询,如

选择T1_Id,从表2中选择T2_Id作为T2_Id,从表2中选择C1作为C1,从表2中选择C2作为C2,从表2中选择C3作为表1中的C3。Pro提示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表是非规范化的。在应用程序中更改此选项可能为时已晚,但无论如何都应该阅读相关内容。

欢迎使用堆栈溢出。请回答您的问题,解释如何从两个表格中获得所需的结果。也许你不应该使用单词data作为每个数据项的占位符,而应该将它们改为data01、dataa02等等。嘿,O.Jones,我对这个问题做了一些编辑,希望这样更好!请参阅:也许可以在您的表中添加更多的示例行,以使结果显示更少的dataxxx值?谢谢您的回答,这正是我所寻找的,我知道该表没有规范化,不幸的是,不是我创建了db项目,该表已经存在。
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