MySql表,其中每行有多个外键指向一个表
我对目前的情况有所了解: 表1包装清单: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
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